【发布时间】:2014-05-12 12:59:52
【问题描述】:
我已经被这个问题困扰了几天了,仍然无法弄清楚为什么:
我需要更新我的 Oracle 数据库中的一条记录,在执行更新查询之前,我想用“SELECT x FOR UPDATE NOWAIT”锁定数据,但是在调用 ExecuteNonQuery 时,我的 web 服务挂起。
直接对数据库执行 sql 语句可以立即工作。 这是代码:
OracleTransaction transact = OraDCS.BeginTransaction();
OracleCommand cmd = OraDCS.CreateCommand();
cmd.CommandText = string.Format("UPDATE FLIGHT_MANIFEST_PASSENGER SET ETAT_PASSAGER = '{2}',GATE_BOARDING = {0} WHERE REF_DOSSIER = '{1}'", ConfigurationManager.AppSettings["CodeMoyen"].ToString(), ref_dossier, etatPax);
OracleCommand blq = OraDCS.CreateCommand();
blq.CommandText = string.Format("SELECT * FROM FLIGHT_MANIFEST_PASSENGER WHERE REF_DOSSIER = '{0}' FOR UPDATE NOWAIT", ref_dossier);
bool blqOK = false;
try
{
blq.ExecuteNonQuery();
blqOK = true;
}
catch (Exception ex)
{
LogThreadSafe.Instance.Info("LanceSQL Error : " + blq.CommandText + " " + ex.Message);
}
if (blqOK)
{
try
{
cmd.ExecuteNonQuery();
transact.Commit();
}
catch (Exception ex)
{
transact.Rollback();
LogThreadSafe.Instance.Info("LanceSQL Error : " + blq.CommandText + " " + ex.Message);
}
}
else
transact.Rollback();
实际上是在数据库上执行了锁,但是程序仍然在这一行挂起:
blq.ExecuteNonQuery();
编辑:即使在将事务链接到命令之后,我仍然会遇到冻结。 但是,当我在服务器上部署我的 web 服务并“实时”测试它而不是在我的开发机器上调试时,它可以工作,有什么想法吗?
【问题讨论】:
-
不是您问题的答案,但请注意,您的第二个 catch 块中有一个复制/粘贴错字 - 您是从 blq 命令发出异常消息cmd.
标签: c# oracle freeze executenonquery