Java DB2选择在同一个表上使用并发批处理(删除/插入)获取死锁

Java DB2选择在同一个表上使用并发批处理(删除/插入)获取死锁,java,jdbc,db2,deadlock,isolation-level,Java,Jdbc,Db2,Deadlock,Isolation Level,我正在开发两个应用程序,一个是后端应用程序,一个是前端web应用程序,通过DB2作为dbms。web应用程序通过后端公开的服务访问数据库,这是唯一可以修改表上数据的人 在后端应用程序中,还有一个java批处理进程,负责更新注册表表数据,从web应用程序(通过后端服务)和其他应用程序读取数据。批量工作如下所述: 使用autocommit false启动连接(jdbc驱动程序!) 使用truncate语句擦除所有行 下载一个源文件,并在文件行上循环开始大规模插入 如果全部完成,则称为提交,否则称为

我正在开发两个应用程序,一个是后端应用程序,一个是前端web应用程序,通过DB2作为dbms。web应用程序通过后端公开的服务访问数据库,这是唯一可以修改表上数据的人

在后端应用程序中,还有一个java批处理进程,负责更新注册表表数据,从web应用程序(通过后端服务)和其他应用程序读取数据。批量工作如下所述:

  • 使用autocommit false启动连接(jdbc驱动程序!)
  • 使用truncate语句擦除所有行
  • 下载一个源文件,并在文件行上循环开始大规模插入
  • 如果全部完成,则称为提交,否则称为回滚

此行为是必要的,因为在更新过程未结束的同时,必须将数据读入此表的其他应用程序必须读取旧数据

问题在于,在平均执行时间为40分钟的批处理执行期间,每个select操作都会返回死锁,并出现以下错误:SQLCODE:-913、SQLSTATE:57033、SQLERRMC:00C9008E

我正在阅读此链接,试图了解我需要在delete/insert语句上使用什么隔离级别来避免行锁定,但我没有找到解决方案

我认为问题出在truncate语句(),但使用delete语句时,死锁错误发生在select中,如果select正在运行,delete语句将获得死锁

我想通过jdbc使用批处理方法,但我从未在db2上使用过,我不知道db2上的可靠性


我还观看了coverage index解决方案(我无法发布声誉限制的url),但考虑到select for the web应用程序读取所有列,这不是一个可行的解决方案

您正在链接到DB2forz/OS和DB2LUW。您有什么DB2?z/OS(2.12)。DB2版本11处于兼容模式。