【问题标题】:How can I lock inserting in multiple table?如何锁定插入多个表?
【发布时间】:2015-02-09 08:43:20
【问题描述】:

我使用此命令在多行中插入多条记录,如果插入不成功,如何锁定我的命令并回滚更改?

SqlCommand cmd = new SqlCommand();

        string s = @"

                declare @one_id int; 

                INSERT INTO tbl_one(o1,o2,o3) VALUES(@o1,@o2,@o3);

                set @one_id=SCOPE_IDENTITY();

                INSERT INTO tbl_two(t1,t2,f3) VALUES(@t1,@t2,@one_id);
                INSERT INTO tbl_two(t1,t2,f3) VALUES(@t3,@t4,@one_id);
                INSERT INTO tbl_two(t1,t2,f3) VALUES(@t5,@t6,@one_id);
                ";

        cmd.CommandText =s;

【问题讨论】:

标签: sql asp.net sql-server transactions locking


【解决方案1】:

你肯定熟悉 try catch 语句,所以使用它。

将您的语句包装在 BEGIN TRANSACTION 和 COMMIT 中,如下所示:

        string s = @"
        BEGIN TRY
            BEGIN TRANSACTION 
                declare @one_id int; 

                INSERT INTO tbl_one(o1,o2,o3) VALUES(@o1,@o2,@o3);

                set @one_id=SCOPE_IDENTITY();

                INSERT INTO tbl_two(t1,t2,f3) VALUES(@t1,@t2,@one_id);
                INSERT INTO tbl_two(t1,t2,f3) VALUES(@t3,@t4,@one_id);
                INSERT INTO tbl_two(t1,t2,f3) VALUES(@t5,@t6,@one_id);
            COMMIT
        END TRY
        BEGIN CATCH
            IF @@TRANCOUNT > 0
                ROLLBACK
        END CATCH
        ";

如果您的某个语句失败,CATCH 块将启动。

祝你好运。

【讨论】:

【解决方案2】:

您可以按照 Roy 的建议启动事务并管理 SQL 代码中的错误,也可以在客户端进行:

using (SqlConnection cn = CreateConnection())
using (SqlCommand cmd = CreateMyCommand(cn))
{
    cn.Open();
    using (SqlTransaction tx = cn.BeginTransaction())
    {
        cmd.Transaction = tx;
        cmd.ExecuteNonQuery();
        tx.Commit();
    }       
}

请注意,此处不需要 catch 块,因为如果发生故障,事务将在 tx.Dispose() 上回滚。如果某些事情失败,则不会调用 tx.commit,但由于 using 块,始终会调用 tx.Dispose。如果之前没有提交,Tx.Dispose 回滚事务。

【讨论】:

  • 哪个更好?客户端还是 SQL 服务器端?它是否可以防止这种情况下的并发问题?
  • 没有什么可以防止并发问题。乐观的并发策略、隔离级别和事务有助于处理它们,但问题不会神奇地消失。
  • 恕我直言,没有一个比另一个更好。我认为这是一个偏好问题,他们的行为几乎相同,但略有不同。
【解决方案3】:
猜你喜欢
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多