JPA规范中,Lock Mode的值中包含了Optimistic, 一看就知道是用于乐观锁控制, 但是我一直被这个问题困扰,原因在于,在Entity中,已经使用@Version做了乐观锁控制,Hibernate会自动更新比对,version值,那么设置Lock Mode 为Optimistic又有何用处呢?
先看一段代码
@PersistenceContext
EntityManager entityManager;
@Transactional()
public Order t3(String str) {
Order order67 = entityManager.find(Order.class, 67L, LockModeType.OPTIMISTIC);
order67.setCancelReason(str);
return order67;
}
这段代码中使用了entity manager查询order,并且指定了乐观锁,然后在更新order,最初我以为这段代码会触发两条sql语句
select ... from `order` ...;
update `order` set .... where id = ? and version = ?;
但是出乎我意料的是,我看到了第三条sql语句
select version from `order` where id = ?;
于是乎我在find时,去除了Optimistic的配置, 发现这第三条sql就不会触发。我百思不得其解,这Optimistic如同鸡肋一样。无意中找到在stack overflow上找到一篇帖子,看到其中一段对话,豁然开朗&#