Intereting Posts
Файлы отчетов SSRS (.rdl) как обновить до последнего? SQL Server «<>» оператор очень медленный по сравнению с «=» на таблице с несколькими миллионами строк Выполнение хранимой процедуры Oracle из SQL Server 2005 TSQL Как выбрать сотрудника с навыками в столбце xml Включение интеграции CLR на SQL Server 2008-r2 Преобразование float в datetime Найти все таблицы, содержащие столбец с указанным именем как получить список экземпляров Sql Server (или SqlExpress), которые установлены и существуют в локальной сети Триггер, который вставляет данные в новую таблицу при обновлении другой таблицы sql присоедините 2 таблицы к самой ранней дате после даты в первой таблице Как найти размер данных, возвращаемых из таблицы Подключение к SQL Server в виртуальной машине с использованием локальной машины Использование автоматической настройки localdb для модульного тестирования; как очистить? База данных отсутствует! Поиск основной причины COALESCE, IFNULL или NZ (), которые могут использоваться в SQL Server и MS Access

Использование транзакции в одном операторе обновления

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

begin transaction *single update statment:* update table whatever with whatever commit transaction 

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

Solutions Collecting From Web of "Использование транзакции в одном операторе обновления"

Возможно, транзакция была включена из-за предшествующего или возможного будущего кода, который может включать другие данные. Возможно, этот разработчик просто делает привычку обертывать код в транзакции, чтобы быть «безопасным»?

Но если оператор буквально включает только одно обновление в одну строку, в этом случае нет никакой выгоды для этого кода. Транзакция не обязательно «блокирует» что-либо, хотя действия, выполняемые внутри нее, могут, конечно. Он просто гарантирует, что все действия, содержащиеся в нем, выполняются все или ничего.

Обратите внимание, что транзакция не о нескольких таблицах – это о нескольких обновлениях . Обеспечение того, что несколько обновлений происходят все-либо-ничто.

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

На самом деле, вероятно, довольно распространено, что транзакции инкапсулируют несколько обновлений в одну и ту же таблицу. Представьте себе следующее:

 INSERT INTO Transactions (AccountNum, Amount) VALUES (1, 200) INSERT INTO Transactions (AccountNum, Amount) values (2, -200) 

Это должно быть заключено в транзакцию, чтобы гарантировать правильность перевода денег. Если кто-то терпит неудачу, то другой.

Я понимаю, что это неправильно, потому что транзакция используется, когда вы хотите обновлять несколько таблиц.

Не обязательно. Это включает только одну таблицу – и всего 2 строки:

 --- transaction begin BEGIN TRANSACTION ; UPDATE tableX SET Balance = Balance + 100 WHERE id = 42 ; UPDATE tableX SET Balance = Balance - 100 WHERE id = 73 ; COMMIT TRANSACTION ; --- transaction end 

Надеюсь, код вашего коллеги больше походит на это, иначе SQL выдаст синтаксическую ошибку. Согласно комментарию Ypercube, нет никакой реальной цели размещения одного оператора внутри транзакции, но, возможно, это стандарт кодирования или аналогичный.

 begin transaction -- Increases @@TRANCOUNT to 1 update table whatever with whatever commit transaction -- DECREMENTS @@TRANCOUNT to 0 

Часто при выпуске adhoc-операторов непосредственно против SQL рекомендуется помещать ваши заявления в транзакцию, на случай, если что-то пойдет не так, и вам нужно откат, т. Е.

 begin transaction -- Just in case my query goofs up update table whatever with whatever select ... from table ... -- check that the correct updates / deletes / inserts happened -- commit transaction -- Only commit if the above check succeeds.