使用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本身会保证不发生死锁。

而程序不执行那是由于等待被锁住的资源而产生的等待,注意这不是死锁,因为另外一个锁表的进程提交以后等待锁的程序自然会执行。

 

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