один оператор "commit" без "begin транзакции" - PullRequest
2 голосов
/ 10 января 2012

я использую web2py dal с адаптером mysqldb для подключения к серверу mysql.

мой вопрос:

  1. зачем нужен один " commit «без начала» начать транзакцию »после« set autocommit = 0 »
  2. действительно ли оператор« select »начинает транзакцию, если autocommit = 0?

информация о сервере: модуль автоматической обработки innodb = 1 (значение по умолчанию) tx_isolation = repeatable-read (значение по умолчанию)

general_log:

100356 10:00:00 123456 Connect  dummy@172.0.0.1 on dummydb
123456 Query    SET NAMES 'utf8'
123456 Query    SET AUTOCOMMIT = 0
123456 Query    COMMIT
123456 Query    SET FOREIGN_KEY_CHECKS=1
123456 Query    SET sql_mode='NO_BACKSLASH_ESCAPES'

Ответы [ 2 ]

7 голосов
/ 10 января 2012

Э-э ... потому что вы отключили автоматическую фиксацию ????

Вот хорошее объяснение:

http://rpbouman.blogspot.com/2007/02/mysql-transactions-and-autocommit.html

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

По умолчанию в MySQL включен автокоммит.

Другими словами:

  1. «транзакции» не обязательно связаны только с «выполнением нескольких операторов как одного атомарного объекта»

  2. автокоммит дает вам«иллюзия» одного оператора == 1 транзакция

  3. На самом деле, «autommit off» дает вам «один оператор == 0 транзакций»

По той же ссылке:

... Смысл автоматического отключения в том, что вы можете выдавать несколько операторов и фиксировать их все одновременно.

3 голосов
/ 10 января 2012

В стандартном SQL вы (почти) всегда находитесь внутри транзакции.Если вы делаете COMMIT или ROLLBACK, следующий оператор запускает новую транзакцию.Поэтому, если вы хотите, чтобы изменения вступили в силу, вы должны их УДАЛИТЬ.

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

Когда вы выключаете AutoCommit, вы должны выполнить COMMIT, чтобы изменения базы данных вступили в силу.

Некоторые СУБД имеют незначительные изменения в этой теме.

В частности, Informix, имеет один режим базы данных, где AutoCommit включен, пока вы не сделаете явное НАЧАЛО [РАБОТЫ];тогда вы находитесь в транзакции, пока не выполните COMMIT [WORK] или ROLLBACK [WORK].Он также имеет «MODE ANSI», который ведет себя как в стандартном SQL;и у него есть режим без журнала, где вообще нет транзакций.

С учетом всего сказанного, показанные вами утверждения не являются самоочевидными, которые действительно нуждаются в транзакционной поддержке.Это, как правило, операторы DML (SELECT, INSERT, DELETE, UPDATE, MERGE и т. Д.), А иногда и операторы DDL, которые требуют поддержки транзакций.Некоторые СУБД не позволяют откатывать операторы DDL (Oracle);другие делают (Informix).

...