#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:
Существует обратная зависимость между безопасностью транзакций и производительностью.
Если вы выберете наилучший уровень изоляции, вы также получите худшую производительность.
Вы должны сделать компромисс между ними.
Смотрите этот тест для получения более подробной информации.