READ_UNCOMMITTED vs Нет транзакций? - PullRequest
2 голосов
/ 18 января 2011

В чем разница между выполнением SQL вне транзакции и выполнением его в режиме изоляции READ_UNCOMMITTED?

Уточнение : я пытаюсь понять разницу между java.sql.Connection.TRANSACTION_NONE и java.sql.Connection.TRANSACTION_READ_UNCOMMITTED

Ответы [ 2 ]

3 голосов
/ 18 января 2011

TRANSACTION_NONE означает, что соединение вообще не поддерживает транзакции, и любая попытка навязать семантику транзакций этому соединению должна завершиться неудачей.Я не вижу, чтобы это когда-либо было полезным, за исключением, возможно, случаев, когда вы используете «поддельную» базу данных, такую ​​как файлы CSV.

READ_UNCOMMITTED, с другой стороны, означает, что соединение используеттранзакции, и сможет читать данные из незафиксированных транзакций других соединений.Как сказал @Pax, это следует использовать с особой осторожностью.

Обратите внимание также на метод setTransactionIsolation:

Обратите внимание, что Connection.TRANSACTION_NONE нельзя использоватьпотому что он указывает, что транзакции не поддерживаются.

Таким образом, вы не можете заставить соединение использовать TRANSACTION_NONE - соединение либо поддерживает транзакции, либо нет, и если это не так, вы можете 'Не связывайтесь с этим методом.

READ_UNCOMMITTED все еще означает, что вы находитесь в транзакции.Вы по-прежнему получаете элементарные записи, а другие транзакции по-прежнему изолированы от ваших записей.Однако ваша транзакция не изолирована от других людей.TRANSACTION_NONE бесплатно для всех - никто не изолирован от чего-либо.

0 голосов
/ 18 января 2011

READ_UNCOMMITTED (или грязное чтение) предоставит вам информацию о транзакциях, которые еще не завершены.

Обычно это не очень хорошая идея, поскольку полученная информация может быть противоречивой.Мы использовали его, чтобы избежать тупиковых ситуаций в приложениях для составления отчетов, где незначительные данные не имеют значения, но, если вам вообще важна точность (например, начисление денег людям или банковское дело), ​​я бы этого не сделал.

Выполнение SQL вне транзакции (я предполагаю, что обновления здесь) не должно быть возможным.Требования ACID, как правило, требуют транзакций даже для самого простого обновления - вы не можете явно НАЧАТЬ или ПРИНЯТЬ транзакцию, но я гарантирую, что это произойдет под прикрытием (по крайней мере, для достойной реляционной СУБД).

...