使用oledb訪問Oracle,ExecuteNonQuery是否立刻提交呢,是否會造成死鎖

有這麼一段程序:

 

OleDbConnection conSin = new OleDbConnection(connStrSin3);
            OleDbCommand comSin = new OleDbCommand();
            try
            {
                conSin.Open();
                comSin.Connection = conSin;
                comSin.CommandText = " update testlockb set cid=5 ";
                comSin.ExecuteNonQuery();
                int x = 0;
                

            }
            catch (Exception ex)
            {
             
             
            }
            finally
            {
                comSin.Dispose();
                conSin.Close();
                conSin.Dispose();
            }

 

 

在“ int x = 0;”處加斷點,並使用sqlplus 執行語句 update tablelockb set cid =2; 能夠執行,不等待鎖。說明即使沒有close連接,ExecuteNonQuery(),也會commit提交,所以這種情況下使用oledb執行多個查詢、修改然後再close連接,是不會留死鎖的後患的。放心去做吧。

 

那麼如果把代碼做如下修改:

 

 

  try
            {
                conSin.Open();
                OleDbTransaction tran = conSin.BeginTransaction();
                comSin.Connection = conSin;
                comSin.Transaction = tran;
                comSin.CommandText = " update testlockb set cid=5 ";
                comSin.ExecuteNonQuery();

                comSin.CommandText = " update testlock set cid =5 ";

                comSin.ExecuteNonQuery();


                tran.Commit();
              

                int x = 0;
                

            }
            catch (Exception ex)
            {
             
             
            }
            finally
            {
                comSin.Dispose();
                conSin.Close();
                conSin.Dispose();
            }

 

 

斷點設在紅色代碼,也就是說先更新testlockb 然後中斷。這是在sqlplus中執行“update testlock set cid=6;”;

再繼續執行程序,此時程序執行黃色代碼時卡住了。再在sqlplus中執行“update testlockb set cid =6 ;”,則程序報異常,提示檢測到死鎖。

所以,這種情況下死鎖把程序卡住不能執行的情況也不會發生,oracle本身會保證不發生死鎖。

而程序不執行那是由於等待被鎖住的資源而產生的等待,注意這不是死鎖,因爲另外一個鎖表的進程提交以後等待鎖的程序自然會執行。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章