乐观的锁定和交易

时间:2014-04-02 11:42:10

标签: java hibernate optimistic-locking

我已经在Hibernate中阅读了@Version注释。似乎我对它有一个浅薄的理解,或者更确切地说 - 对它所需要的地方的理解不够。

情况:假设我有可重复读取隔离级别。我同时执行了两段代码:

代码1:

sessionFactory.openSession();
MyEntity entity = (MyEntity) session.get(MyEntity, 10);
entity.setValue(5);
session.getTransaction().commit();

码2:

sessionFactory.openSession();
MyEntity entity = (MyEntity) session.get(MyEntity, 10);
entity.setValue(10);
session.getTransaction().commit();

问题:

  • MyEntity类中没有@Version注释的结果是什么?
  • MyEntity类中的@Version注释会产生什么结果?
  • * [Main] *如果结果相同,那么使用@Version注释的优势是什么?

3 个答案:

答案 0 :(得分:3)

首先,如果您具有可重复的读隔离级别,则第二个事务将仅在第一次提交后执行。因此,乐观锁定没有用处。 当你使用乐观锁定时,db会在读取实体时记下版本,当它写回更新后的实体时,它会检查版本是否被修改。如果修改它将抛出一个OptimisticLockException,否则它将写入更新的实体并更新版本

答案 1 :(得分:2)

如果您不使用锁定策略,则最后一次提交将赢得'。某些提供程序默认情况下实现乐观锁定,因此您不必在会话或查询上设置任何属性。

如果您使用乐观锁定策略,则第一个事务将增加版本,第二个事务将获得OptimisticLockException

然后您可以捕获它,刷新实体,或者重试您的更改。

使用版本字段与不使用版本字段之间的区别在于,并非所有锁定策略都需要为没有版本字段的实体实施。因此,定义@Version字段可使您的代码更具可移植性。

答案 2 :(得分:2)

因此,如果添加@Version,您的表将在常规列旁边显示一个名为version。

的列

每次提交新值时,它都会递增。

在代码1中你有session.get你的实体将有一个版本'x'

当代码2读取时你可能还有版本'x'所以如果代码1提交你将有版本x + 1,并且到时候代码2提交将看到版本抛出异常的差异。

如果没有你,只需覆盖写入DB的值代码1。

相关问题