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

时间:2017-06-16 14:39:14

标签: java jdbc db2 deadlock isolation-level

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

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

  • 使用autocommit false(jdbc driver!)
  • 启动连接
  • 使用truncate statement
  • 删除所有行
  • 下载源文件,并在文件行
  • 上启动带有循环的大量插入
  • 如果全部完成则称为提交,否则称为回滚


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

问题是在批处理执行期间,平均执行时间为40分钟,每个选择操作都会返回死锁,并显示以下错误:SQLCODE:-913,SQLSTATE:57033,SQLERRMC:00C9008E。

我正在尝试理解我需要在删除/插入语句上使用什么隔离级别以避免行锁定,阅读此链接https://www.ibm.com/support/knowledgecenter/en/SSEPEK_10.0.0/sqlref/src/tpc/db2z_sql_isolationclause.html,但我找不到解决方案。

我认为问题是truncate语句(https://www.ibm.com/support/knowledgecenter/en/SSEPGG_9.7.0/com.ibm.db2.luw.sql.ref.doc/doc/r0053474.html),但是也使用delete语句在select中发生死锁错误,并且,如果有select运行,则删除获取死锁。

我正在考虑通过jdbc使用批处理方法,但我从未在db2上使用过这个,我不知道db2的可靠性!

我还看了覆盖索引解决方案(我不能发布声誉限制的url),但考虑到web应用程序的选择读取了所有列,它不是一个可行的解决方案!

0 个答案:

没有答案