我正在对事务使用企业库数据访问块,但是当我在事务代码块中调用其他方法(select命令)时,我得到了超时错误,因为事务锁定了数据库。
如何在事务中调用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;
}发布于 2011-12-22 00:06:36
问题在于,您正在启动一个事务,执行插入操作,然后尝试使用不同的连接执行select操作。
因为它是一个不同的连接,所以select不参与原始事务。这会导致select被未完成的事务阻塞。
解决方法是在您的事务中包含您的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。如果您采用这种方法,就不必将事务传递给您的方法。
或者,如果符合您的要求,您可以提交事务,然后执行select。
https://stackoverflow.com/questions/8589102
复制相似问题