2014-05-12 61 views
2

我一直停留在這幾天,現在,仍然無法找出原因:甲骨文的ExecuteNonQuery掛在「選擇更新NOWAIT」

我需要在我的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(); 

該鎖在DATABSE實際執行,但該計劃仍處於該行掛起:

blq.ExecuteNonQuery(); 

編輯:連交易我仍然連接到命令後體驗凍結。 但是,當我在服務器上部署我的web服務,並且在我的開發機器上測試它「實時」而不是在調試時,它可以工作,有什麼想法?

+0

不回答你的問題,但要注意,你在你的第二個catch塊複製/粘貼錯字 - 你是從* BLQ *命令發出,而不是*在cmd異常消息* 。 –

回答

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)); 
+0

即使將命令與事務關聯後,我仍然遇到問題,但我認爲問題不在代碼中。 當我在服務器上部署我的web服務,並且在開發機器上測試它「活動」而不是在調試時,它可以正常工作,我不會遇到凍結。 你有什麼線索爲什麼? 感謝您輸入btw。 – JuFra

+0

@JuFra也許有另一個事務(不指定'NOWAIT')阻止所述的行? – Rik

+0

不,沒有,我有一個軟件來監視我的數據庫上的鎖,沒有。 我想也許它可能與Oracle數據訪問提供程序有關?或者我的即時客戶端,某個地方的某個參數? 無論如何,我會將您的答案標記爲最佳答案,因爲它很有用,而且我的問題與代碼無關,因爲我認爲它是有用的。謝謝 – JuFra

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

也許您的交易不必須連接