0

我试图了解如何使用 ESQL 管理死锁。我创建了 2 个并发进程来尝试更新“客户”表,就像 O'Neil 的书“数据库”中给出的示例: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

但是由于某种原因,等待 1 完成的进程 2 在语句“exec sql update customers”处阻塞,并且永远不会进入“if(sqlca.sqlcode == DEADABORT)”语句。因此,我永远无法处理僵局。

有人有想法吗?

4

1 回答 1

0

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

在单线程程序中

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

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

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

于 2010-11-26T03:37:24.800 回答