我有一个spring batch应用,基本上它有它的reader和writer实现。在我的writer中,我首先尝试通过JpaRepository findBy方法读取Table-A,然后如果db中不存在record,那么我尝试将记录插入到同一个表Table-A。然而,当我这样做时,我面临着spring batch日志中的表死锁问题,如下所示
SQL Error: 60, SQLState: 61000
ORA-00060: deadlock detected while waiting for resource
HHH000010: On release of batch it still contained JDBC statements
我已经在write方法上使用了@Transactional
注解,我正在为我的自定义writer实现ItemWriter
。我还尝试将db连接最大空闲时间减少到2分钟,如下所示,但Table-A中仍然存在表死锁
spring.datasource.hikari.maxLifeTime : 120000
Table-A是一个基本的JPA实体类。但是,15分钟后,表锁被释放,出现以下错误序列,writer处理所有记录。
JobRepository failure forcing rollback
org.springframework.dao.ConcurrencyFailureException: PreparedStatementCallback; SQL [UPDATE schema_name.BATCH_STEP_EXECUTION_CONTEXT SET SHORT_CONTEXT = ?, SERIALIZED_CONTEXT = ? WHERE STEP_EXECUTION_ID = ?]; ORA-02396: exceeded maximum idle time, please connect again
; nested exception is java.sql.SQLException: ORA-02396: exceeded maximum idle time, please connect again
java.sql.SQLException: ORA-01012: not logged on
Encountered an error saving batch meta data for step readDataStep in job Import DB Data. This job is now in an unknown state and should not be restarted.
org.springframework.dao.OptimisticLockingFailureException: Attempt to update step execution id=***** with wrong version (1), where current version is 2
我使用的是Oracle数据库.任何人都可以请建议为什么我得到表死锁错误,所有我做的是从表读取-A插入数据之前,然后写入数据库,如果它是不可用.我已经用尽了我的所有选项,请协助.
1条答案
按热度按时间8hhllhi21#
我在write方法上使用了@Transactional注解,
这很可能是问题的原因。writer将在Spring Batch驱动的事务中执行,因此不需要在write方法上添加该注解。