我正在开发2个应用程序,一个后端和一个前端Web应用程序,而不是DB2作为dbms。 Web应用程序通过后端公开的服务访问数据库,这是唯一可以修改表中数据的人。
在后端应用程序中还有一个java批处理进程,负责更新从Web应用程序(通过后端服务)和其他应用程序读取的注册表数据。批处理工作如下所述:
此行为是必要的,因为同时更新过程未结束其他应用程序,必须读取此表中的数据,必须读取旧数据。
问题是在批处理执行期间,平均执行时间为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应用程序的选择读取了所有列,它不是一个可行的解决方案!