如何在多个表中锁定插入?

Mik*_*ike -1 sql sql-server asp.net locking transactions

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

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;
Run Code Online (Sandbox Code Playgroud)

Roy*_*ron 7

当然你熟悉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
        ";
Run Code Online (Sandbox Code Playgroud)

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

祝好运.

  • @@ TRANCOUNT - >"返回当前连接上发生的BEGIN TRANSACTION语句的数量"请参阅https://msdn.microsoft.com/en-us/library/ms187967.aspx (3认同)