Использование транзакции в одной инструкции update

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

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

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

3 ответов


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

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

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

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

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

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.