我已经被困在这几天了,仍然无法弄清楚原因:
我需要更新Oracle数据库中的记录,在执行Update查询之前,我想用" SELECT x FOR UPDATE NOWAIT"来锁定数据,但在调用ExecuteNonQuery时,我的webservice挂起。
直接对数据库执行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服务时,测试它" live"而不是在我的开发机器上调试,它的工作原理,任何想法?
答案 0 :(得分:0)
如果我必须使用交易,我通常会这样做:
OracleCommand cmd = OraDCS.CreateCommand();
OracleTransaction transact=cmd.Connection.BeginTransaction();
cmd.Transaction=transact;
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);
也许您的交易没有连接
答案 1 :(得分:0)
您需要将命令与事务相关联:
cmd.Transaction = transact;
blq.Transaction = transact;
我还强烈建议您不要通过字符串连接来构建查询文本,而是使用参数来防止SQL注入。例如:
blq.CommandText = "SELECT * FROM FLIGHT_MANIFEST_PASSENGER WHERE REF_DOSSIER = :pDossier FOR UPDATE NOWAIT";
blq.Parameters.Add(new OracleParameter("pDossier", ref_dossier));