(帮助)SqlTransaction 循环

(help) SqlTransaction Loop

提问人:This lowly newb 提问时间:8/9/2017 更新时间:8/13/2017 访问量:670

问:

需要对 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();
}

问题是,我应该在每个循环提交一次,还是让它循环然后提交事务?

C# ado.net

评论


答:

1赞 Zohar Peled 8/13/2017 #1

事务是 SQL 将不同的语句绑定到单个原子操作中的方式 - 这意味着全有或全无 - 如果一个语句失败,事务范围内的所有先前语句都将回滚,并且事务中的下一个语句都不会被执行。

事务可以以两种不同的方式之一结束 - 提交或回滚。它只能提交或回滚一次。

因此,要将该信息转化为对您问题的直接回答,必须在循环之后。如果单个保存操作失败,则事务将回滚并退出该方法。只有当它们都成功时,您才会提交事务。trans.Commit();

顺便说一句,只要有可能,你应该将实现接口的类的所有实例包装在一个语句中:IDisposableusing

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();
    }
}