Читать незафиксированные против сделки?
В чем разница между выполнением SQL вне транзакции и выполнением его в режиме изоляции READ_UNCOMMITTED?
Пояснение : я пытаюсь понять разницу между java.язык SQL.Соединение.TRANSACTION_NONE и java.язык SQL.Соединение.TRANSACTION_READ_UNCOMMITTED
2 ответа:
TRANSACTION_NONE
это означает, что соединение вообще не поддерживает транзакции, и любая попытка навязать семантику транзакций этому соединению должна завершиться неудачей. Я не вижу, чтобы это когда-либо было полезно, за исключением, возможно, случаев, когда вы используете "поддельную" базу данных, например CSV-файлы.
READ_UNCOMMITTED
, с другой стороны, это означает, что соединение использует транзакции и сможет считывать данные из незафиксированных транзакций других соединений. Как сказал @Pax, это следует использовать с крайней осторожность.Обратите также внимание на
setTransactionIsolation
Метод:Таким образом, вы не можете заставить соединение использоватьОбратите внимание, что
Connection.TRANSACTION_NONE
нельзя использовать, поскольку он указывает, что транзакции не поддерживаются.TRANSACTION_NONE
- соединение либо поддерживает транзакции, либо нет, и если это не так, вы не можете связываться с этим методом.
READ_UNCOMMITTED
все еще означает, что вы находитесь в сделке. Вы все еще получаете атомарные записи, и другие транзакции все еще изолированы от ваших записей. Однако, ваша сделка не изолирована от других народов.TRANSACTION_NONE
является свободным для всех - никто не получает изоляции ни от чего.
READ_UNCOMMITTED (или грязные чтения) даст вам информацию о транзакциях, которые еще не завершены.
Обычно это не очень хорошая идея, так как полученная информация может быть противоречивой. Мы использовали его, чтобы избежать тупика в приложениях для отчетности, где незначительные данные не имеют значения, но если вы заботитесь о точности (например, взимание денег с людей или банковское дело), я бы этого не делал.
Выполнение SQL вне транзакции (я предполагаю, что обновления здесь) не должно это действительно возможно. Требования ACID обычно требуют транзакций даже для самого простого обновления - вы не можете явно начать или зафиксировать транзакцию, но я гарантирую, что это будет происходить под прикрытием (по крайней мере, для приличной реляционной СУБД).