Читать незафиксированные против сделки?


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

Пояснение : я пытаюсь понять разницу между java.язык SQL.Соединение.TRANSACTION_NONE и java.язык SQL.Соединение.TRANSACTION_READ_UNCOMMITTED

2 2

2 ответа:

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

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

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

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

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

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

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

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

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