2015-11-25 3 views
1

Если я начинаю транзакцию, запускаю некоторые запросы и затем фиксирую ее, выполняет ли фиксация, применяя результаты запросов или сами запросы?Выполняет ли транзакция MySQL применимые запросы или результаты?

Например, если моя транзакция содержит insert into b select x from a, а x изменяется после выполнения этого запроса, но до того, как я совершу транзакцию, результатом будет значение x, как это было во время транзакции, или значение x at время совершения?

ответ

0

Ответ:x будет иметь значение, которое у него было на отметке времени чтения.

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

Разъяснение: Использование транзакции будет гарантировать, что все операции в границах сделок выглядят атомное к внешнему миру.

Atomic операция означает, что:

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

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

Так, чтобы быть более конкретным в отношении вашего вопроса, когда select x from a вызывается в транзакции, таблица a блокируется до сделки либо совершает или откат. Сценарий, который вы упомянули, x изменяется после выполнения этого запроса (до совершения транзакции/откат), практически невозможно.

+0

Итак, когда вызывается select, он одновременно считывает значение и блокирует таблицу, чтобы она не могла быть изменена до момента совершения транзакции? Вы говорите, что все выходы внутри транзакции блокируют таблицу до завершения транзакции? – Benubird

+0

@Benubird Да, мы можем в основном заключить этот путь. Все READ в транзакции сделают WRITE-блокировку для таблиц, которые они использовали, поэтому внешний мир не может WRITE для этой таблицы, но они могут свободно читать. С другой стороны, если транзакция WRITE для таблицы, то эта таблица заблокирована для READ и WRITE для внешнего мира. – Musa

Смежные вопросы