【问题标题】:Using transaction on a single update statement在单个更新语句上使用事务
【发布时间】:2012-09-11 12:22:56
【问题描述】:

我在工作中为一些 SP 配音,我发现编写代码的人在这样的单个更新语句上使用了事务

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

我知道这是错误的,因为当您要更新多个更新时会使用事务。 我想从理论上理解,使用上述代码的含义是什么? 在有事务和没有事务的情况下更新任何表有什么区别吗?有没有多余的锁之类的?

【问题讨论】:

  • 这是一个单一语句的事务。也许最初的开发者认为将来可能需要额外的语句/操作。

标签: sql-server transactions


【解决方案1】:

可能由于先前或将来可能涉及其他数据的代码而包含该事务。也许那个开发者只是养成了在事务中包装代码的习惯,以保证“安全”?

但是,如果该语句实际上只涉及对单行的一次更新,那么在这种情况下存在该代码确实没有任何好处。事务不一定会“锁定”任何东西,尽管在其中执行的操作当然可以。它只是确保其中包含的所有操作要么全部执行,要么全部执行。

请注意,事务不是关于多个表,而是关于多个更新。它可以确保多次更新完全或无。

因此,如果您要更新同一个表两次,无论有没有事务都会有所不同。但是您的示例仅显示了一条更新语句,大概只更新了一条记录。

事实上,事务将多个更新封装到同一个表中可能很常见。想象一下:

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

这应该包含在交易中,以确保资金正确转移。如果一个失败了,另一个也必须失败。

【讨论】:

  • 问题是:单个更新语句有事务和没有事务有区别吗?
  • @user1662812 它完全没有任何作用。所有单个语句都已经有效地包装在事务中。不过,我不相信这会创建一个外部的包装事务。
【解决方案2】:

我知道这是错误的,因为当您要更新多个表时使用了事务。

不一定。这仅涉及一个表 - 仅 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

【讨论】:

    【解决方案3】:

    希望你同事的代码看起来更像这样,否则 SQL 会发出语法错误。 根据 Ypercube 的评论,在事务中放置一个语句没有真正的目的,但这可能是一个编码标准或类似的。

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

    通常,当直接针对 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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-11
      • 2013-12-01
      • 2017-08-11
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 2016-01-06
      相关资源
      最近更新 更多