use*_*812 11 sql-server transactions
我在工作中配音一些SP,我发现编写代码的人在这样的单个更新语句中使用了一个事务
begin transaction
*single update statment:* update table whatever with whatever
commit transaction
Run Code Online (Sandbox Code Playgroud)
我知道这是错误的,因为当您想要更新多个更新时使用事务.我想从理论上理解,使用上述代码有什么含义?在有和没有交易的情况下更新任何表有什么区别吗?有没有额外的锁或东西?
由于可能涉及其他数据的先前或可能的未来代码,可能包括交易.也许开发人员只是习惯于在交易中包装代码,以便"安全"?
但是,如果该语句只涉及单个行的单个更新,那么在这种情况下,那里的代码确实没有任何好处.事务并不一定"锁定"任何事情,当然,在其中执行的操作可能也是如此.它只是确保其中包含的所有动作都是全有或全无的.
请注意,事务不是关于多个表,而是关于多个更新.它确保多个更新发生全有或全无.
因此,如果您两次更新同一个表,那么无论是否有交易都会有所不同.但是您的示例仅显示一个更新语句,可能只更新一条记录.
事实上,事务可能会将多个更新封装到同一个表中.想象一下:
INSERT INTO Transactions (AccountNum, Amount) VALUES (1, 200)
INSERT INTO Transactions (AccountNum, Amount) values (2, -200)
Run Code Online (Sandbox Code Playgroud)
这应该包含在交易中,以确保钱被正确转移.如果一个失败,另一个失败.
我知道这是错误的,因为当您想要更新多个表时使用事务.
不必要.这只涉及一个表 - 只有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
Run Code Online (Sandbox Code Playgroud)
希望您的同事的代码看起来更像这样,否则SQL将发出语法错误。根据Ypercube的评论,在事务中放置一条语句并没有真正的目的,但这可能是编码标准或类似标准。
begin transaction -- Increases @@TRANCOUNT to 1
update table whatever with whatever
commit transaction -- DECREMENTS @@TRANCOUNT to 0
Run Code Online (Sandbox Code Playgroud)
通常,在直接针对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.
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
29264 次 |
最近记录: |