1

ObjectOptimisticLockingFailureException当我使用 microsoft sqlserver 驱动程序 (sqljdbc4.jar) 时,我得到了批量更新。但是,使用相同的代码,当我将驱动程序切换到 Jtds 驱动程序时,我能够成功地进行批量更新和插入。我们在 Hibernate 中使用 sql server 数据库和 JPA。

下面是我正在做的事情。

  1. 从数据库中获取数据,status_code 为 SUBMITTED,当前标志为 Y。

  2. 批量更新记录到当前标志 N 并批量插入具有新状态 BATCH_LOCKED 的新记录。

  3. 使用当前标志 N 再次批量更新上述记录,并批量插入状态为 COMPLETED 的新记录。

所有这些更新都顺利进行。提交事务时,我收到以下异常

我没有专门定义乐观锁定,也没有为任何列定义 @Version 注释。默认情况下乐观锁定是如何发生的?

如果我评论第 3 步,则不会出现异常。

为什么我没有得到 JTDS 驱动程序的异常?

org.springframework.orm.ObjectOptimisticLockingFailureException:批量更新从更新[1]返回了意外的行数;实际行数:0;预期:1;嵌套异常是 org.hibernate.StaleStateException:批量更新从更新 [1] 返回了意外的行数;实际行数:0;预期:1

4

1 回答 1

1

在第 3 步中,当您尝试更新相同的条目时,第 1 步和第 2 步中的值已更改。因此您需要再次读取更新的数据,然后进行更新。

乐观锁定异常可防止丢失更新,您不应忽略它。您可以简单地在一个常见的异常处理程序中捕获它并将用户重定向到当前工作流的起点,这表明存在他不知道的并发更改。

于 2018-11-13T04:26:22.233 回答