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

时间:2015-02-09 08:43:20

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

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

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;

3 个答案:

答案 0 :(得分: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
        ";

如果您的某个陈述失败,将启动CATCH阻止。

祝你好运。

答案 1 :(得分: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,但由于使用了块,因此总是调用tx.Dispose。如果事先没有提交过,Tx.Dispose会回滚事务。

答案 2 :(得分:1)