如何锁定插入多个 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 如果之前未提交事务,则回滚该事务。
我使用此命令在多行中插入多条记录,如果插入不成功,我如何锁定我的命令并回滚更改?
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 如果之前未提交事务,则回滚该事务。