EntLib 5事务错误

时间:2011-12-21 11:30:05

标签: transactions enterprise-library

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

如何在事务中调用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;      
 }

1 个答案:

答案 0 :(得分: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。如果您采用这种方法,则不必将事务传递给您的方法。

或者您可以提交交易,然后根据您的要求执行选择。