首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表锁可以消除死锁或使其更糟吗?

表锁可以消除死锁或使其更糟吗?
EN

Database Administration用户
提问于 2015-08-24 00:00:31
回答 1查看 1.1K关注 0票数 3

我们遇到了Oracle数据库存在死锁问题的情况。

我说也许我们应该锁进一些桌子锁,而男人对我的反应是

“除非我误解了表锁的含义,否则我认为表锁不会消除死锁…--它可能会加剧死锁。”

他说的是真的吗?

我们得到的错误:“等待资源堆栈跟踪时检测到死锁”

以下是我们收到的错误的大部分电子邮件:

代码语言:javascript
复制
System Error: Error for Step Type:REMOVE PRED OPEN MAN User Error:       
ORA-00060: deadlock detected while waiting for resource Stack Trace:    

Timestamp 2015/08/21 14:02:39:130363000130363000
dbms_utility.format_error_backtrace:
ORA-06512: at "OM.FOLDER_PKG", line 2661
ORA-06512: at "OM.DOC_LOG_STEP_PKG", line 2436
dbms_utility.format_error_stack:
ORA-00060: deadlock detected while waiting for resource

更新:

这可能是有用的,这是一位熟悉这种情况的开发人员每隔几个月就会发生一次,而该公司的DBA似乎无法解决这一问题。

这个项目的主要开发商是这样说的:

除非我误解了您所说的表锁的含义,否则我认为表锁不会消除死锁…它有可能加剧这一问题。

例如:

交易1

  1. 锁表X在10:00:00 (所有时间都只是例子)
  2. 试图在10:00:02锁定表Y。死锁-事务2等待事务1解锁表X,事务1等待事务2解锁表Y

交易2

  1. 10:00锁Y桌
  2. 试图在10:00:01锁定表X。块,等待事务1释放锁。

可以用“记录”代替“表”一词。问题依然存在。认为较低的表格粒度而不是记录会使问题变得更糟。

我们可以通过以下方式处理这一问题:

  • 用一致的顺序锁定表--这很难做到,因为我们有数千行代码,我们需要确保调用的顺序是相同的。它还会导致更丑陋的代码,在这些代码中,为了避免死锁,自然的处理流程可能会被更改。
  • 从一开始就锁定单个对象上的所有顶级事务(然后,它们可以将子表/对象锁定到它们的心脏内容)。文件夹端的自然对象是一个WORK_FOLDER。
  • 回滚死锁并重新尝试--我们已经实现了这一点,但它只进行了一次重试,有时Oracle需要很长时间才能检测到死锁发生。偶尔,一次重试是不够的。
EN

回答 1

Database Administration用户

发布于 2015-08-24 12:11:50

除了有人做完整的表锁,还有两件事我可以想到。如果您有一个表,其中有几个列与子表中的同一列有父列关系,如果子列没有索引,则索引它可能会有所帮助。我有一个在线内容管理系统的案例,该系统取消了导致级联锁的索引外键。通过使用Tom查询查找缺少的索引并将它们添加进来,我能够解决这个问题。

代码语言:javascript
复制
http://tkyte.blogspot.com/2009/10/httpasktomoraclecomtkyteunindex.html

另一种可能是,有两个触发器在不同的表上触发,并且每个触发器都试图更新另一个表。您可以通过查看从死锁生成的跟踪日志并确定哪些对象和行被锁定,然后检查触发器是否有任何触发器正在运行该SQL来判断这一点。

了解这种情况发生了多长时间,以及在这成为一个问题时发生了什么变化,这将是有帮助的。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/111971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档