我有一个spring批处理应用程序,基本上它有它的读取器和写入器实现。在我的作家首先,我试图读取表a通过JpaRepository findBy方法,然后如果记录不存在于数据库中,那么我正试图将记录插入到同一表表a.然而,当我这样做时,我面临的问题表死锁在春季批处理日志如下
SQL Error: 60, SQLState: 61000
ORA-00060: deadlock detected while waiting for resource
HHH000010: On release of batch it still contained JDBC statements
我在写方法上面使用了@Transactional
注释,我正在为我的自定义编写器实现ItemWriter
。我也试图减少db连接的最大空闲时间2分钟如下,但仍然表死锁存在于表a
spring.datasource.hikari.maxLifeTime : 120000
桌子是一个基本的JPA实体类。然而,15分钟后,表锁被释放,并出现以下错误序列,写入器处理所有记录。
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插入数据之前读取,然后写入数据到数据库,如果它不可用。我已穷尽所有办法,请给予协助。
我在写方法上使用了@Transactional注释,
这很可能是您的问题的原因。写入器将在Spring Batch驱动的事务中执行,因此不需要在write方法上添加注释。