在ESQL中发生死锁时,sqlcode不会返回DEADABORT

时间:2010-11-26 02:37:46

标签: oracle deadlock embedded-sql

我正在尝试了解如何使用ESQL管理死锁。我创建了两个尝试更新“customers”表的并发进程,就像O'Neil的书“Database”中给出的示例一样:http://books.google.ca/books?id=UXh4qTpmO8QC&pg=PA298&lpg=PA298&dq=%22deadabort%22+oracle&source=bl&ots=2QF7eSbaW6&sig=IcEZtSXINKrOVro1UN-ShlNsAak&hl=en&ei=9BPvTKPfMtP4nwfqu_X1Cg&sa=X&oi=book_result&ct=result&resnum=1&ved=0CBcQ6AEwAA#v=onepage&q=%22deadabort%22%20oracle&f=false

但由于某种原因,进程2正在等待1在语句“exec sql update customers”中完成块,并且从不输入“if(sqlca.sqlcode == DEADABORT)”语句。因此,我永远无法解决僵局。

有人有想法吗?

1 个答案:

答案 0 :(得分:0)

在没有看到代码的情况下很难评论,但即使你有两个连接,数据库死锁错误也很难(如果不是不可能)在单线程程序中产生。

在单线程程序中

  • 连接A锁定行R1。
  • 连接B锁定R2行。
  • 连接A尝试锁定行R2并等待

它尚未达到死锁条件,因为连接A只是在等待连接B.数据库不知道两个数据库连接都来自单个进程/线程,因此它不知道它们已死锁。

此问题有时会出现连接池问题。一个最终用户会话使用池中的连接锁定共享资源。其他池连接将填满所有等待该共享资源,然后该原始最终用户会话无法获取连接池线程以释放该资源。