Oracle ExecuteNonQuery挂起"选择立即更新"

时间:2014-05-12 12:59:53

标签: c# oracle freeze executenonquery

我已经被困在这几天了,仍然无法弄清楚原因:

我需要更新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"而不是在我的开发机器上调试,它的工作原理,任何想法?

2 个答案:

答案 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));