当我使用Microsoft sqlserver驱动程序(sqljdbc4.jar)时,我得到了ObjectOptimisticLockingFailureException
的批处理更新。但是,使用相同的代码,当我将驱动程序切换到Jtds驱动程序时,我能够成功进行批处理更新和插入。我们正在将SQL Server数据库和JPA与Hibernate结合使用。
下面是我在做什么。
从状态码为SUBMITTED的数据库中获取数据, 当前标记为Y。
批处理将记录更新为当前标记N,并以新状态BATCH_LOCKED批处理插入新记录。
所有这些更新都正常进行。提交事务时,我在下面遇到异常
我没有专门定义乐观锁定,也没有为任何列定义@Version批注。默认情况下,乐观锁定如何发生?
如果我评论第3步,那么我不会得到例外。
为什么我的JTDS驱动程序没有异常?
org.springframework.orm.ObjectOptimisticLockingFailureException:批处理 update从更新[1]返回意外行数;实际行 计数:0;预期:1;嵌套异常为 org.hibernate.StaleStateException:批处理更新返回意外 更新[1]中的行数;实际行数:0;预期:1
答案 0 :(得分:0)
在第3步中,当您尝试更新相同的条目时,该值在第1步和第2步中已更改。因此,您需要再次读取更新的数据,然后再进行更新。
乐观锁定异常可防止丢失更新,因此您不应忽略它。您可以简单地将其捕获到公共异常处理程序中,然后将用户重定向到当前工作流的起点,表明存在他不知道的并发更改。