Как отключение автоматической фиксации помогает начать транзакцию в JDB C? - PullRequest
0 голосов
/ 11 февраля 2020

Во многих статьях и документах говорится, что, отключив автоматическую фиксацию, вы можете начать транзакцию в JDB C. Эта топика c также задает тот же вопрос, но не отвечает на вопрос и просто говорит:

Изменение режима автоматической фиксации вызывает фиксацию текущей транзакции (если активен).

ОК. а дальше?

для поиска ответа, я искал и нашел этот :

  • Автоматическое принятие транзакций:

Каждый отдельный оператор является транзакцией.

  • Явные транзакции:

Каждая транзакция явно начинается с оператора BEGIN TRANSACTION и явно заканчивается с оператором COMMIT или ROLLBACK.

  • Неявные транзакции:

Новая транзакция неявно запускается после завершения предыдущей транзакции, но каждая транзакция явным образом завершается оператором COMMIT или ROLLBACK.

И затем я обнаружил this :

Совершенные транзакции

После отключения режима автоматической фиксации операторы SQL не фиксируются, пока вы не вызовете метод commit явно. Все операторы, выполненные после предыдущего вызова метода commit, включены в текущую транзакцию и зафиксированы вместе как единое целое.

Поэтому я прихожу к выводу что после отключения режима автоматической фиксации мы находимся в неявном режиме, и мы также знаем, что для отключения автоматической фиксации был выполнен оператор COMMIT, поэтому после выключения автоматической фиксации мы запустили новую транзакцию.

Можем ли мы сделать такой вывод на основании этих случаев? это правильный вывод?

1 Ответ

1 голос
/ 11 февраля 2020

Нет, вы не можете. В JDB C автоматическая фиксация определяет только время завершения транзакции. Ожидается, что драйвер начнет транзакцию, когда это необходимо. В частности, спецификация JDB C 4.3 говорит в разделе 10.1 Границы транзакции и автоматическое принятие :

Когда начинать новую транзакцию, решение принято неявно либо драйвером JDB C, либо основным источником данных. Хотя некоторые источники данных реализуют явный оператор «начать транзакцию», для этого не существует API JDB C. Как правило, новая транзакция запускается, когда текущая инструкция SQL требует такой транзакции, и транзакции уже не выполняются. Требуется ли транзакция для данного оператора SQL, также определяется SQL: 2003.

Атрибут Connection auto-commit указывает, когда завершать транзакции. Включение автоматической фиксации вызывает фиксацию транзакции после каждого отдельного оператора SQL, как только этот оператор завершается. Точка, в которой оператор считается «завершенным», зависит от типа оператора SQL, а также от того, что приложение делает после его выполнения:

  • Для операторов языка манипулирования данными (DML) такие как операторы Insert, Update, Delete и DDL, оператор завершается, как только он завершил выполнение.
  • Для операторов Select оператор завершается, когда связанный набор результатов закрыт.
  • Для объектов CallableStatement или для операторов, которые возвращают несколько результатов, оператор завершается, когда все связанные наборы результатов были закрыты, и все значения обновлений и выходные параметры были получены.

Другими словами, когда вы звоните connection.setAutoCommit(false), никакая транзакция не будет начата. Только когда выполняется оператор (или другая операция, требующая транзакции), транзакция будет запущена, если нет активной транзакции.

...