带有Microsoft驱动程序而不是jtds驱动程序的org.springframework.orm.ObjectOptimisticLockingFailureException

时间:2018-11-13 01:13:00

标签: java hibernate jtds sqljdbc

当我使用Microsoft sqlserver驱动程序(sqljdbc4.jar)时,我得到了ObjectOptimisticLockingFailureException的批处理更新。但是,使用相同的代码,当我将驱动程序切换到Jtds驱动程序时,我能够成功进行批处理更新和插入。我们正在将SQL Server数据库和JPA与Hibernate结合使用。

下面是我在做什么。

  1. 从状态码为SUBMITTED的数据库中获取数据, 当前标记为Y。

  2. 批处理将记录更新为当前标记N,并以新状态BATCH_LOCKED批处理插入新记录。

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

所有这些更新都正常进行。提交事务时,我在下面遇到异常

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

如果我评论第3步,那么我不会得到例外。

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

  

org.springframework.orm.ObjectOptimisticLockingFailureException:批处理   update从更新[1]返回意外行数;实际行   计数:0;预期:1;嵌套异常为   org.hibernate.StaleStateException:批处理更新返回意外   更新[1]中的行数;实际行数:0;预期:1

1 个答案:

答案 0 :(得分:0)

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

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