特殊Batch Process并行运行时出现死锁错误

日期: 2009-06-03 作者:Brian Peasland翻译:April 来源:TechTarget中国 英文

问:我们在带有24台处理机的E10000 SUn /Solaris机箱上运行。我们在并排运行一个具体Batch Process时的不停地收到死锁错误(ora-60)。好像毫无疑问是出现了 itl 问题(等待着共享锁,但是不包括这两个程序里的那些锁,因为initrans=1)。我们现在有20个程序一起运行,并且还总是在相同的更新语句上阻止Oracle。

所以好像结果丢失了并且创建的新表里的n个initran都比较高(究竟有多高?)有些人说这可能和块密度相排斥,所以解决办法可以是增加pctfree。你怎么认为?选择prctfree或者initrans,在什么情况下密度变成了它们的问题呢?此外,我还想……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

问:我们在带有24台处理机的E10000 SUn /Solaris机箱上运行。我们在并排运行一个具体Batch Process时的不停地收到死锁错误(ora-60)。好像毫无疑问是出现了 itl 问题(等待着共享锁,但是不包括这两个程序里的那些锁,因为initrans=1)。我们现在有20个程序一起运行,并且还总是在相同的更新语句上阻止Oracle。所以好像结果丢失了并且创建的新表里的n个initran都比较高(究竟有多高?)有些人说这可能和块密度相排斥,所以解决办法可以是增加pctfree。你怎么认为?选择prctfree或者initrans,在什么情况下密度变成了它们的问题呢?此外,我还想了解更多有关在死锁的情况下从Oracle中读取dump的知识。我怎样解释这些dump,特别是我如何判断那个被一个程序阻止而被另一个会话等待的资源?我认为这样做有助于判断在资源上的观点而不是被终止的语句明显的显示。谢谢您的建议。Thanasis Giannopoulos。

  答:Thanasis, 我想问一下你为什么你觉得在死锁的情况下你会有ITL(Interested Transaction List)的问题。ITL常用于在更改块时支配事务。有两个参数来支配ITL,分别是INITRANS和 MAXTRANS。INITRANS指定了ITL可以跟踪事务的具体数量。例如表的默认值就是‘1’;索引的为‘2’。MAXTRANS指定了ITL可跟踪的事务的最大数量。对于索引和表这两者来说,默认值都是‘255’。

  由于越来越多的事务都喜欢更改块(表或索引),ITL开始从INITRANS发展成为MAXTRANS。除非在非常极端的情况下,否则你没有必要改变这些参数的默认值。很少会出现大量的事务来竞争一个块的情况。你可以能想增大INITRANS、加快事务执行速度。这样一来,ITL可能就不会出现增长,因为它的赋值已经比较大了。但是正如我刚才说的,这种情况很少出现,我希望这对你有帮助。
 
  设置更高的PCTFREE将会意味着块中将存储更少的行。可能你的这些行分布到了更多的块中。它同样还意味着你可能有更大的空间浪费了。这些行分布到更多的块中,你的事务也分布到了更多的块中。

  我推测改变INITRANS或PCTFREE的值并且重建表可以解决死锁的问题。死锁情况出现通常是因为事务A在一个资源(resource_1)上面有锁,并请求在另一资源(resource_2)上的锁。事务B在第二个资源上(resource_2)有锁并要求在第一个资源(resource_1)上的锁。事务A现在正等着事务B释放锁。同时(也是关键的一点:“同时”),事务B也在等着事务A释放它的锁。这两个事务都是‘死锁’。换句话说,他们都在等着对方释放锁,而是它们在完成之前却又不会释放这些锁并且不能获得另一个锁的话又完成不了。现在就玩起了"Catch 22"的游戏。Oracle RDBMS自动监测到了死锁并回滚了这一监测到死锁的过程。

  所以当你在表中的行里获取锁或登陆到索引时,你会看到死锁情况发生。这和ITL(和 INITRANS)或块中闲置的空间大小(以及PCTFREE)并没有关系。调整这些值并不能解决你死锁的情况,你也很容易就能测试到。用不同的值重建你的表并返回之前执行过的应用程序,还是会出现死锁的情况。如果同时还有相同的操作在运行的话,这种情况还会经常发生。

  但你不用担心,因为你已经胜利了一半!你已经确定了出现死锁情况的具体地方。继续跟踪下去就是一件很困难的事情了。现在你可以看看应用程序,看看它是如何获取锁的。你可能想实施不同的事务支配(如SERIALIZABLE事务)防止出现死锁情况。你可以阅读Oracle 8i概念指南》尤其是第二十四章《数据并发性和连续性》了解更多有关事务控制的知识。

作者

Brian Peasland
Brian Peasland

Techtarget旗下Searchoracle网站的资深专家,有16年IT行业经验、计算机科学硕士、专攻数据库方向,曾担任系统管理员等职。此外,他还获Oracle 7.3、8和8i的OCP数据库管理员证书,目前为SGT Inc.公司首席DBA。

翻译

April
April

相关推荐

  • 使用调度和锁定进行MySQL查询优化(下)

    在防止死锁(deadlock)方面,表层次的锁比细微层次的锁更有优势。使用表层次的锁的时候,死锁不会发生。

  • 避免Oracle错误

    我如何才能避免 ORA-01501、ORA-00200、ORA-00202、ORA-27038以及OSD-04010这些错误?

  • 带shell脚本的ORA-00054错误

    如果出现了带shell脚本的ORA-00054错误:ORA-00054: resource busy and acquire with NOWAIT specified。我们该怎么处理?

  • 处理ORA-01251错误

    接到客户的claim:用户通过ERP无法登录到服务器,检查了下中间件运行正常,看了下中间件的日志提示无法连接数据库!