Stored procedures 表锁导致的db2存储过程性能问题

Stored procedures 表锁导致的db2存储过程性能问题,stored-procedures,locking,db2,database-performance,Stored Procedures,Locking,Db2,Database Performance,我编写了一套存储过程,将记录从暂存表插入到主数据库表中。我们最近发现了性能问题,db2top显示表上有大量锁,我们认为这是性能差的主要原因 套件有一个控制存储过程,它调用将不同记录组写入数据库的每个过程。其中一项要求是,系统处理所有记录并报告错误,根据提出的错误,受控过程决定在每个批次结束时提交还是回滚整个批次 我对锁定的理解是,要释放锁,我必须执行提交或回滚以释放锁,但这会导致记录在我们知道是否要提交批之前提交到数据库 对于如何在批处理完成之前停止大量锁而不必提交,有人有什么建议吗 感谢您的帮

我编写了一套存储过程,将记录从暂存表插入到主数据库表中。我们最近发现了性能问题,db2top显示表上有大量锁,我们认为这是性能差的主要原因

套件有一个控制存储过程,它调用将不同记录组写入数据库的每个过程。其中一项要求是,系统处理所有记录并报告错误,根据提出的错误,受控过程决定在每个批次结束时提交还是回滚整个批次

我对锁定的理解是,要释放锁,我必须执行提交或回滚以释放锁,但这会导致记录在我们知道是否要提交批之前提交到数据库

对于如何在批处理完成之前停止大量锁而不必提交,有人有什么建议吗


感谢您的帮助

根据您的设计,您可以使用一个临时表,在其中放置所有要插入的行。一旦决定了要在主数据库表中插入哪些行,就可以在那里插入它们。很可能,您正在主表中创建锁,因为您正在主表上插入锁,然后,如果执行回滚,则这些行在回滚结束之前仍然被锁定;应该发生与提交类似的情况

您可以使用自动锁列表大小,最终maxlocks也会自动

最后,您还可以使用表锁来锁定表,而不是在表级别使用多行锁和意图锁,但是并发性将受到严重影响


这些是一些建议,但都取决于您的设计。

锁本身不会导致性能下降。锁争用,即不同应用程序之间对锁定行的竞争,可能会导致性能低下。根据你的描述,锁根本不是罪魁祸首


现在要回答您的问题“如何停止大量锁”:您需要选择最不严格的隔离级别,该级别仍然适合您的业务逻辑和/或通过限制单个事务中的行数来减少事务大小。另一种减少锁数量的方法是锁定整个表,而不是像@AngocA建议的那样锁定单个锁,但是,这通常会增加争用,从而对性能造成更大的影响。

批处理有多大?如果它们太大,db可能会将它们升级为整表锁。检查每一个块或记录添加后的错误,如果中间有致命错误,请继续进行,不要继续。根据您的查询的编写方式,它们可能会导致问题。。。