C# (帮助)SqlTransaction循环

C# (帮助)SqlTransaction循环,c#,ado.net,C#,Ado.net,需要得到有关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_I

需要得到有关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();
}
SqlConnection con=newsqlconnection(GetConnectionString());
con.Open();
SqlTransaction trans=con.BeginTransaction();
bool-IsSave=false;
for(int i=0;i

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

事务是SQL将不同语句绑定到一个原子操作中的一种方式,即全部或全无。如果一条语句失败,则事务作用域中以前的所有语句都将回滚,执行事务中的下一个语句的非

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

因此,要将这些信息转换为对您的问题的直接回答,请使用
trans.Commit()必须位于循环之后。如果单个保存操作失败,事务将回滚,您将退出该方法。只有当它们全部成功时,您才提交事务

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

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();
    }
}
使用(var-con=new-SqlConnection(GetConnectionString()))
{
con.Open();
使用(var trans=con.BeginTransaction())
{
bool-IsSave=false;
for(int i=0;i