есть ли разница между Select внутри транзакции и за ее пределами

уровень изоляции по умолчанию Read COMMITTED каким-то образом заставляет оператор select действовать иначе внутри транзакции, чем тот, который не находится в транзакции?

Я использую MSSQL.

4 ответов


Да, внутри транзакции можно увидеть изменения, внесенные другими предыдущими инструкциями Insert/Update/delete в это транзакция, оператор Select вне транзакции не может....

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

а то явно в транзакции может (потому что у нее есть инструкция Begin Transaction) могут быть другие операторы (вставки/обновления/удаления, что угодно), происходящие в той же транзакции, до или после этой инструкции Select.

Так независимо от уровня изоляции, оба выбора (внутри или вне явной транзакции) будут, тем не менее, находиться в транзакции, которая работает на этом уровне изоляции.

дополнение: Ниже приведен пример SQL Server, но все базы данных должны работать одинаково. В SQL Server обработчик запросов всегда находится в одном из 3 режимов транзакций,автофиксации, подразумевается или явно.

автофиксации - режим управления транзакциями по умолчанию компонента SQL Server Database Engine. .. Каждая инструкция Transact-SQL фиксируется или откатывается по завершении. ... если оператор завершается успешно, он фиксируется; если он сталкивается с какой-либо ошибкой, он откатывается. Это значение по умолчанию и является ответом на вопрос @Alex в комментариях.

на Неявной Транзакции mode, "... база данных SQL Server Двигатель автоматически запускает новую транзакцию после фиксации или отката текущей транзакции. Вы ничего не делаете для определения начала транзакции; вы только фиксируете или откатываете каждую транзакцию. Неявный режим транзакций создает непрерывную цепочку транзакций. ..."Обратите внимание, что выделенный курсивом фрагмент предназначен для каждой транзакции, будь то одна или несколько транзакций оператора.

двигатель помещен в Явной Транзакции режим, когда вы явно инициируете транзакцию с помощью BEGIN TRANSACTION заявление. Затем каждый оператор выполняется в этой транзакции, пока вы явно не завершите транзакцию (с COMMIT или ROLLBACK) или если происходит сбой, который приводит к завершению и откату двигателя.


Да, есть небольшая разница. Для MySQL база данных фактически не начинается с моментального снимка до вашего первого запроса. Поэтому значение имеет не begin, а первый оператор в рамках транзакции. Если я сделаю следующее:

#Session 1
begin; select * from table;

#Session 2
delete * from table; #implicit autocommit

#Session 1
select * from table;

тогда я получу то же самое в сеансе один раз оба раза (информация, которая была в таблице, прежде чем я удалил ее). Когда я заканчиваю сеанс транзакции (commit, begin или rollback) и снова проверяю из этого сеанса, таблица покажут как пустые.


Если ваша база данных (или в mysql, базовый механизм хранения всех таблиц, используемых в вашем операторе select) является транзакционной, то просто нет способа выполнить ее "вне транзакции".

вы имели в виду "запустить его в автоматическом режиме", но это не то же, что "нет транзакций". В последнем случае он все еще выполняется в транзакции, просто транзакция заканчивается сразу после того, как ваш оператор finshed.

Так, в обоих случаях, во время запуск, одна инструкция select будет изолирована на уровне фиксации чтения от других транзакций.

теперь, что это означает для вашего уровня изоляции транзакции Read COMMITTED: возможно, удивительно, не так много.

Read COMMITTED означает, что вы можете столкнуться с неповторяемыми считываниями: при запуске нескольких операторов select в одной транзакции возможно, что строки, выбранные в определенный момент времени, изменяются и комментируются другим торговая операция. Вы сможете увидеть эти изменения при повторном выполнении инструкции select позже в той же отложенной транзакции. В режиме autocommit эти 2 инструкции select будут выполняться в их собственной транзакции. Если бы другая транзакция изменила и зафиксировала строки, выбранные вами в первый раз, вы могли бы увидеть эти изменения так же хорошо, как и при выполнении инструкции во второй раз.


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