@Version批注在JPA中如何工作?
@Version
我找到了各种答案,摘录如下:
JPA使用实体中的版本字段来检测对同一数据存储记录的并发修改。当JPA运行时检测到尝试同时修改同一记录的尝试时,它将向尝试最后提交的事务抛出异常。
但是我仍然不确定它是如何工作的。
同样从以下几行开始:
您应该考虑版本字段是不变的。更改字段值会产生不确定的结果。
这是否意味着我们应该将version字段声明为final?
final
但是我仍然不确定它是如何工作的?
假设一个实体MyEntity具有带注释的version属性:
MyEntity
version
@Entity public class MyEntity implements Serializable { @Id @GeneratedValue private Long id; private String name; @Version private Long version; //... }
更新时,带有注释的字段@Version将增加并添加到WHERE子句中,如下所示:
WHERE
UPDATE MYENTITY SET ..., VERSION = VERSION + 1 WHERE ((ID = ?) AND (VERSION = ?))
如果WHERE子句未能匹配记录(因为同一实体已经被另一个线程更新),则持久性提供程序将抛出OptimisticLockException。
OptimisticLockException
这是否意味着我们应该将我们的version字段声明为final
不可以,但是您可以考虑使二传手受到保护,因为您不应该称呼它。