2012-05-14 39 views
2

最近我每天都会随机地看到一次或两次的死锁,所以我查看了代码&,我们将代码放在一个单独的事务中。同时,我想在Oracle上将ini_trans增加到5,以便处理并发访问。该应用程序使用调用“app_admin”模式的“app_user”模式(app_admin拥有该表),该数据库同时由多个应用程序实例同时访问。我应该增加app_user或app_admin上的ini_trans吗?谢谢。Oracle死锁

+0

1)你的错误信息究竟是什么? 2)你看过为死锁生成的跟踪文件吗?它会告诉你涉及哪些对象。 3)你确定它不是由你的代码以不一致的顺序请求资源引起的吗?我看到很多死锁,但从来没有因为一些Oracle设置太低。 –

+0

1. SQL错误:60,SQLState:61000 ORA-00060:在等待资源时检测到死锁 无法使数据库状态与会话同步 org.hibernate.exception.LockAcquisitionException:无法执行JDBC批更新2.是的,有一个涉及的对象,我修复了代码以处理单个事务中的所有事情,只是为了确保它不会导致应用程序。 3.在一段时间内,该区域没有任何代码更改,并且在增加了对强制数据完整性的数据库的限制之后突然开始发生代码更改。谢谢。 – user1388356

+0

你添加了什么样的限制?你有没有添加任何新的索引?如果查询计划在执行期间发生更改,则完全相同的查询可能会造成死锁。例如,一个会话使用全表扫描并以A B的顺序更新行。而另一个会话使用索引并按B A的顺序更新行。 –

回答

1

我认为它应该是MAXTRANS,你会想要考虑修改,而不是INITRANS,但在10.2以上它已被弃用,默认情况下使用值255。

有任何位图索引?它们有利于引起争论。

+0

没有位图索引,只是只有常规索引。我正在阅读这个http://www.dba-oracle.com/t_initrans.htm页面,并认为我必须增加INITRANS。我在使用Oracle 10g时,检查了ini_trans = 1和max_trans = 255的查询。 1.我应该更换ini_trans或max_trans?和2.这两个最好的价值是什么?谢谢。 – user1388356

+0

您认为有多少用户会同时访问表中的块? –

+0

并发性由JBOSS容器管理的持久性来处理,可能大致我们有50或100个JMS实例。所有实例都将使用相同的用户“app_user”模式来访问app_admin表。 – user1388356

2

Here描述了该问题的可能原因。以下建议帮助我:“索引外键和死锁消失”。检查引用到您的表的外键,并尝试为它们编制索引。