正 文

案例学习Oracle错误:ORA-00060


www.7dspace.com  更新日期:2005-10-14 10:58:39  七度空间


  案例:并行运行某个特定的批处理时发生死锁错误

  描述:我的E10000 SUn /Solaris 机器有24个处理器。当并行运行某个特定的批处理的时候,总是在同一个时间点上发生死锁的错误(ora-60)。看起来,毫无疑问这是itl的问题(两个进程在等待共享锁的时候,都持有排他锁,因为initrans等于1)。我们有20个处理器在并行工作,但是Oracle总是在同一个更新语句上停滞不前。所以,解决方案看起来就是删除掉这个表,然后重新创建拥有更高initrans 的n个initrans 的表(高到什么程度?)。一些人说这可能是锁的密度带来的负面影响,所以解决方法就是增加pctfree 。你认为这个主意怎么样?选择prctfree 或者是initrans ,在哪种情况下密度会由于这些选项而产生问题。还有,我想要知道更多有关如何读取Oracle在发生死锁的时候创建的dump的信息。我如何解释这些dump,特别是,如何识别被停止的进程拥有,同时又被其他会话等待的资源?我觉得这可能会帮助我区别资源的竞争和中断的语句明显显示出来的现象。

  解答: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的关系型数据管理系统自动的检测死锁,并且回滚第一个检测到死锁的过程。

  所以,你现在可以看到,当试图获得表中数据行或者索引中条目的锁的时候,死锁就发生了。这与ITL(还有INITRANS)或者块中剩余空间的大小(还有PCTFREE)毫无关系。调整这些数值不会解决你的死锁问题。并且这是非常容易测试的。重新构建具有不同数值的表并以与以前完全相同的方式重新运行你的应用程序。你还会看到死锁。这通常发生在并行运行同一个操作的时候。

  但是不要担心,因为你现在已经赢了一半了!!!你已经确定了发生死锁状况的特定的地点。这是进行追踪的最困难的事情。现在你可以看一下你的应用程序,看看它是如何引起死锁的。你也许想要实现不同的事务控制(例如串行化事务)来防止死锁情况的再一次发生。你可以在Oracle 8 Concepts Guide中阅读更多有关事务控制的内容(特别是第24章的数据并发性和一致性)。

2页,页码:[1] [2] 

上一篇:QQ会员在QQ论坛使用代码发帖的方法
下一篇:Ajax技术:构建动态的Java应用程序
作者:  来源:Techtarget ( 责任编辑:7dspace )
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐