嵌套事务插入失败

时间:2015-06-27 23:00:31

标签: c# sql-server transactions ado.net dapper

我在c#上使用IDBConecction接口使用嵌套事务。我必须将方法插入到2个不同的表中,但是当涉及到第二个插入时,第一个插入事务会锁定第二个插入事务导致超时异常。

public void FirstInsert()
{
    using (var cn = new Connection().GetConnection())
    {
        cn.Open();
        using (var tran = cn.BeginTransaction())
        {
            try
            {
                //1st insert
                SecondInsert() //calling second insert method
                tran.Commit();                
            }
            catch
            {
                tran.Rollback();
            }
        }
    }
}

public void SecondInsert()
{
    using (var cn = new Connection().GetConnection())
    {
        cn.Open();
        using (var tran = cn.BeginTransaction())
        {
            try
            {
                //2nd insert, this one fails
                tran.Commit();                
            }
            catch
            {
                tran.Rollback();
            }
        }
    }
}

当我检查SqlServer时,fisrt插入的SPID为56,那么当使用SPID 57执行第二次插入时,我使用

exec sp_who2

在专栏" BlkBy"对于SPID 57,它表示已被SPID 56阻止。

我如何克服这些问题?

2 个答案:

答案 0 :(得分:1)

对两个操作使用一个连接。这可能涉及传递连接对象。

通常,每个请求模式的连接+事务很好地解决了这个问题。在各种方法中打开连接是一种代码味道。它表明基础设施无法处理。

答案 1 :(得分:0)

您正在做正确的事情但在第二种方法中不需要单独的连接对象和事务对象,因为对secondinsert()的调用已经在事务范围内。您的代码可以简单地

public void FirstInsert(){
    using (var cn = new Connection().GetConnection()){
        cn.Open();
        using (var tran = cn.BeginTransaction()){
            try{
                //1st insert
                SecondInsert() //calling second insert method
                tran.Commit();                
            }
            catch{
                tran.Rollback();
            }
        }
    }
}

public void SecondInsert(){

               //perform second insert operation             
        }
    }
}