我们有一个由多个技术堆栈使用的Informix数据库表,如ESQL / C,Java(JPA),db批量更新。以下是生产问题,一直困扰着我们(不过常常)。
Caused by: org.hibernate.exception.GenericJDBCException: could not update:
Caused by: java.sql.SQLException: Could not do a physical-order read to fetch next row.
Caused by: java.sql.SQLException: ISAM error: record is locked.
为简洁起见,我删除了一些堆栈跟踪。
经过初步分析,我们发现ESQL / C和Java正在尝试同时更新记录。 ESQL / C锁定了JPA试图刷新的记录。我们的JPA实体有@Version,专为乐观锁定而设计。
现在,我的问题是,当JPA的实体设计用于乐观锁定时,JPA如何表现,但它尝试更新的记录被数据库级别的完全不同的应用程序锁定。
我的想法: