有這麼一段程序:
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本身會保證不發生死鎖。
而程序不執行那是由於等待被鎖住的資源而產生的等待,注意這不是死鎖,因爲另外一個鎖表的進程提交以後等待鎖的程序自然會執行。