我正在使用企业库数据访问块与事务,但是当我在事务代码块中调用其他方法(选择命令)时,我得到超时错误,因为事务锁定了数据库。
如何在事务中调用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 :(得分: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。如果您采用这种方法,则不必将事务传递给您的方法。
或者您可以提交交易,然后根据您的要求执行选择。