Подтвердить что ты не робот

Существует ли разница между оператором select внутри транзакции и тем, что находится за ее пределами

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

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

#Session 1
begin; select * from table;

#Session 2
delete * from table; #implicit autocommit

#Session 1
select * from table;

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

Ответ 3

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

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

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

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

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

Ответ 4

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