如何锁定插入多个 table?

How can I lock inserting in multiple table?

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

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;

你肯定熟悉 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 块将启动。

祝你好运。

以下链接会对您有所帮助:

http://www.codeproject.com/Articles/522039/A-Beginners-Tutorial-for-Understanding-Transaction https://msdn.microsoft.com/en-us/library/2k2hy99x(v=vs.110).aspx

您可以按照 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 不会被调用,但由于使用块,tx.Dispose 总是被调用。 Tx.Dispose 如果之前未提交事务,则回滚该事务。