我正在使用一个Spring Batch应用程序,该应用程序在使用默认JdbcCursorItemReader时遇到DB2死锁。当批处理作业遇到错误时,我们已经设置了SkipListener来将“错误”状态写入相关行,即死锁发生的时间。
我们发现通过使用默认的JdbcPagingItemReader,我们可以避免死锁情况,尽管我们不确定为什么会这样。
我对Spring Batch的理解是,一旦从查询中读取了ResultSet,任何一个Reader都应该释放数据库上的锁,但是JdbcCursorItemReader似乎没有发生这种情况。
谁能帮助我理解为什么会这样?
谢谢!
答案 0 :(得分:0)
JdbcCursorItemReader将在数据库中保持一个位置(光标),以便它知道从下一个读取的位置。该游标由锁保持。 JdbcPageItemReader似乎正在提交从已知起点和终点请求数据的查询,因此它仅读取这两个点之间的数据,而无需在调用之间进行锁定。