提问人:This lowly newb 提问时间:8/9/2017 更新时间:8/13/2017 访问量:670
(帮助)SqlTransaction 循环
(help) SqlTransaction Loop
问:
需要对 SqlTransaction 进行解释和澄清
因此,情况是,基于下面的代码
SqlConnection con = new SqlConnection(GetConnectionString());
con.Open();
SqlTransaction trans = con.BeginTransaction();
bool IsSave = false;
for(int i = 0; i < obj.Count; i++)
{
IsSave = Some_Insert_Method_On_Other_Class(obj[i], con, trans);
if (!IsSave)
{
trans.Rollback();
return;
}
trans.Commit();
}
问题是,我应该在每个循环提交一次,还是让它循环然后提交事务?
答:
1赞
Zohar Peled
8/13/2017
#1
事务是 SQL 将不同的语句绑定到单个原子操作中的方式 - 这意味着全有或全无 - 如果一个语句失败,事务范围内的所有先前语句都将回滚,并且事务中的下一个语句都不会被执行。
事务可以以两种不同的方式之一结束 - 提交或回滚。它只能提交或回滚一次。
因此,要将该信息转化为对您问题的直接回答,必须在循环之后。如果单个保存操作失败,则事务将回滚并退出该方法。只有当它们都成功时,您才会提交事务。trans.Commit();
顺便说一句,只要有可能,你应该将实现接口的类的所有实例包装在一个语句中:IDisposable
using
using(var con = new SqlConnection(GetConnectionString()))
{
con.Open();
using(var trans = con.BeginTransaction())
{
bool IsSave = false;
for(int i = 0; i < obj.Count; i++)
{
IsSave = Some_Insert_Method_On_Other_Class(obj[i], con, trans);
if (!IsSave)
{
trans.Rollback();
return;
}
}
trans.Commit();
}
}
评论