2011-12-21 80 views
0

我正在使用企业库数据访问块与事务,但当我在事务代码块中调用其他方法(选择命令)我得到超时错误,因为事务锁定数据库。EntLib 5交易错误

如何在事务中调用select命令?

我的代码:

dbConn.Open(); 
using (dbConn) 
{ 
    using (dbTrans = dbConn.BeginTransaction()) 
    { 
     try 
     { 
      var cmd = dbClass.GetStoredProcCommand("Test_Insert"); 
      dbClass.AddInParameter(cmd, "@No", DbType.String, "Test"); 
      dbClass.AddOutParameter(cmd, "@ReturnValue", DbType.Int32, 4); 
      retval = dbClass.ExecuteNonQuery(cmd, dbTrans); 
      if (retval > 0) 
       retval = Convert.ToInt32(dbClass.GetParameterValue(cmd, @ReturnValue")); 
       var dsDetail=GetDetail(retval); **<-- Error Line i waiting long times and get timeout error** 
      dbTrans.Commit(); 
     } 

    } 

} 

private DataSetGetDetail (int TestID) 
{ 
    var TestSql = "Select * from 
    TestTable Where ID="+TestID; 
    var cmdTest = dbClass.GetSqlStringCommand(TestSql); 
    var dsTest= dbClass.ExecuteDataSet(cmd); 
    return dsTest;  
} 

回答

0

的问题是,你开始一个事务,执行插入,然后尝试使用不同的连接进行选择。

由于它是不同的连接,所以select不参与原始事务。这导致选择被未完成的事务阻塞。

解决方法是将您的选择包括在您的交易中。只需通过交易:

private DataSetGetDetail (int TestID, DbTransaction dbTrans) 
{ 
    var TestSql = "Select * from 
    TestTable Where ID="+TestID; 
    var cmdTest = dbClass.GetSqlStringCommand(TestSql); 
    var dsTest= dbClass.ExecuteDataSet(cmd, dbTrans); 
    return dsTest;  
} 

另一种方法是使用System.Transactions and use a TransactionScope。如果你采用这种方法,你不必将交易传递给你的方法。

或者您可以提交交易,然后执行选择,如果这符合您的要求。