我编写了一套存储过程,用于将登台表中的记录插入主数据库表。我们最近发现性能问题,db2top表明它在表上有很多锁,我们认为这是导致性能不佳的主要原因。
该套件具有一个控制存储过程,该过程调用将不同记录组写入数据库的每个过程。其中一个要求是系统处理所有记录并报告错误,并根据已经引发的错误,受控程序决定是否在每个批次结束时提交或回滚整个批次。
我对锁定的理解是,为了释放锁,我必须执行提交或回滚以释放锁,但这会导致记录在我们知道是否要提交批处理之前提交到数据库。
有没有人对如何在批量完成之前不必提交就停止大量锁定有任何建议?
感谢您的帮助
答案 0 :(得分:0)
根据您的设计,您可以使用临时表来放置要插入的所有行。一旦确定要在主数据库表中插入哪些行,只需将它们插入那里即可。您可能正在主表中创建锁,因为您正在插入它们,然后,如果执行回滚,那些行仍将被锁定,直到回滚结束;应该发生类似的提交。
您可以使用自动锁定列表大小,最终maxlocks也是自动的。
最后,您还可以使用表锁来锁定表,而不是在表级锁定许多行锁和意图锁,但是并发会受到严重影响。
这些是一些建议,但所有这些都取决于你的设计。
答案 1 :(得分:0)
锁定本身不会导致性能下降。它是锁争用,即锁定行的不同应用程序之间的竞争,可能导致性能不佳。根据你的描述,根本没有关注锁是罪魁祸首。
现在回答你的问题,“我如何能够阻止大量的锁”:你需要选择最不严格的隔离级别,它仍然适合你的业务逻辑和/或减少通过限制单个事务中的行数来确定事务大小。减少锁定数量的另一种方法是锁定整个表而不是单个锁定,如@AngocA建议的那样,但是,这通常会增加争用,从而进一步损害性能。