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

 
   | |

导读:专家在文中主要介绍了特殊Batch Process并行运行时出现死锁错误这种情况时的处理方法。

关键词:Oracle错误 Batch Process 死锁

正在加载数据... 【TechTarget中国原创】我们在带有24台处理机的E10000 SUn /Solaris机箱上运行。我们在并排运行一个具体Batch Process时的不停地收到死锁错误(ora-60)。好像毫无疑问是出现了 itl 问题(等待着共享锁,但是不包括这两个程序里的那些锁,因为initrans=1)。我们现在有20个程序一起运行,并且还总是在相同的更新语句上阻止Oracle。所以好像结果丢失了并且创建的新表里的n个initran都比较高(究竟有多高?)

【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概念指南》尤其是第二十四章《数据并发性和连续性》了解更多有关事务控制的知识。

 
查看全文
 
 
 
 
 

Oracle错误

 
Oracle通常将没有引号的标识符转换成大写键盘的,在提交查询时你必须给列名加入双引号以避免出现错误。
 
在Oracle中,CLOB列包含了分隔的10位代码,如何避免重复的代码是一件比较麻烦的事,专家给出了三种解决方法,你可以根据自身情况进行选择。
 
在Windows 2003操作系统下安装了Oracle 8i数据库软件,使用的时候发生Ora-1067错误,出现这一问题的原因是什么,Oracle专家给出了解释。
 
如何在触发器内部建立一个索引,专家说如果DML是EXECUTE IMMEDIATE语句的一部分,你就可以在触发器中执行DML。
 
在进行Oracle实例维护时出现内存分配问题,导致无法启动新连接,正在运行的会话很慢,专家将给出解决方案。
 

登录TechTarget中国

关闭
本服务仅向TechTarget中国的会员开放,请登录或立即免费注册
电子邮件地址:
请输入您的电子邮件地址
密码:
下次自动登录