首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EntLib 5事务错误

EntLib 5事务错误
EN

Stack Overflow用户
提问于 2011-12-21 19:30:05
回答 1查看 316关注 0票数 0

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

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

我的代码:

代码语言:javascript
复制
 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;      
 }
EN

回答 1

Stack Overflow用户

发布于 2011-12-22 00:06:36

问题在于,您正在启动一个事务,执行插入操作,然后尝试使用不同的连接执行select操作。

因为它是一个不同的连接,所以select不参与原始事务。这会导致select被未完成的事务阻塞。

解决方法是在您的事务中包含您的select。只需传递事务:

代码语言:javascript
复制
 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。如果您采用这种方法,就不必将事务传递给您的方法。

或者,如果符合您的要求,您可以提交事务,然后执行select。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8589102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档