Почему TRANSACTION_READ_COMMITTED используется по умолчанию в Java?

#java #transactions

#java #транзакции

Вопрос:

Руководство по транзакциям объясняется в разделе Использование транзакций для сохранения целостности данных:

Уровень изоляции транзакций по умолчанию зависит от вашей СУБД. Например, для Java DB это TRANSACTION_READ_COMMITTED.

Для моей базы данных Postgresql это то же самое. Но это, похоже, не самое лучшее, потому что только TRANSACTION_SERIALIZABLE предотвращает все несоответствия:

 Isolation Level             │Transactions │Dirty Reads   │Non-Repeatable Reads│Phantom Reads
=============================================================================================
TRANSACTION_NONE            │Not supported│Not applicable│Not applicable      │Not applicable
TRANSACTION_READ_COMMITTED  │Supported    │Prevented     │Allowed             │Allowed
TRANSACTION_READ_UNCOMMITTED│Supported    │Allowed       │Allowed             │Allowed
TRANSACTION_REPEATABLE_READ │Supported    │Prevented     │Prevented           │Allowed
TRANSACTION_SERIALIZABLE    │Supported    │Prevented     │Prevented           │Prevented
  

Почему не лучший вариант по умолчанию?

Комментарии:

1. Это не «значение по умолчанию в Java». Значение по умолчанию зависит от базы данных, а не от языка программирования. Сначала вам следует немного ознакомиться с базами данных. Если SERIALIZABLE действительно были «лучшими», зачем вообще нужны какие-либо другие уровни изоляции?

2. Вы подразумеваете / предполагаете, что «предотвращение всех несоответствий» должно определять наилучшее значение по умолчанию?

Ответ №1:

Существует обратная зависимость между безопасностью транзакций и производительностью.
Если вы выберете наилучший уровень изоляции, вы также получите худшую производительность.
Вы должны сделать компромисс между ними.

Смотрите этот тест для получения более подробной информации.