有这么一段程序:
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本身会保证不发生死锁。
而程序不执行那是由于等待被锁住的资源而产生的等待,注意这不是死锁,因为另外一个锁表的进程提交以后等待锁的程序自然会执行。