есть ли различие между избранным оператором в транзакции и тем, который является за пределами него

READ по умолчанию ФИКСИРОВАЛА уровень изоляции, так или иначе заставляет избранный оператор действовать отличающийся в транзакции, чем та, которая не находится в транзакции?

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

38
задан Trott 21 September 2011 в 03:38
поделиться

4 ответа

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

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

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

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

Добавление : Следующее относится к SQL Server, но все базы данных ДОЛЖНЫ работать одинаково. В SQL-сервере процессор запросов всегда находится в одном из 3 режимов транзакций, AutoCommit, Implicit или Explicit.

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

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

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

63
ответ дан 27 November 2019 в 03:30
поделиться

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

#Session 1
begin; select * from table;

#Session 2
delete * from table; #implicit autocommit

#Session 1
select * from table;

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

.
7
ответ дан 27 November 2019 в 03:30
поделиться

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

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

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

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

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

.
3
ответ дан 27 November 2019 в 03:30
поделиться

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

.
2
ответ дан 27 November 2019 в 03:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: