@Version为空时乐观锁定失败

时间:2017-12-01 09:37:04

标签: java spring-data optimistic-locking

我正在处理一些生成序列号的代码。我将读取并更新数据库中的记录,该记录包含要生成的下一个数字。由于我希望有不同的线程访问此记录,我只是将@Version标签添加到同一实体的Timestamp字段中,然后控制可能上升的OptimisticLockExceptions。

此外,我的数据库中会有几个这样的记录,这些记录包含不同的序列号,可以根据业务创建或删除它们。

域对象如下所示:

@Entity
@Table(name="Preferences")
public class Preferences implements Serializable, DomainObject {
...
...
@Column(name="nextSerial")
private String nextSerial;

@Version
@Column(name="RefreshDate")
private Timestamp refreshDate;
...

直到这里一切正常,当共享相同数据的另一个应用程序创建首选项记录时,问题就出现了。构建此应用程序时,@ Version列并不存在,因此它将创建一个Null值为refreshDate的记录。

我知道这一点,我尝试设置一个refreshDate并更新记录,也尝试删除并再次创建记录,但无论如何,我会得到一个像下一个的例外:

  

org.springframework.orm.jpa.JpaOptimisticLockingFailureException:   例外[EclipseLink-5001](Eclipse持久性服务 -   2.6.1.v20150916-55dc7c3):org.eclipse.persistence.exceptions.OptimisticLockException异常   说明:尝试删除该对象   [com.core.domain.Preferences@5e092f04],但它没有版本   身份图中的数字。

所以我的问题是,如何从我的应用程序中处理这个问题?使用数据库中的触发器来确保非零@Version是不可取的,也不需要更改其他应用程序。

1 个答案:

答案 0 :(得分:1)

您可以使用数据库方法在创建时为refreshDate设置默认值吗?喜欢

VERSION BIGINT NOT NULL DEFAULT 1 - 对于数字版本

RefreshDate TIMESTAMP NOT NULL DEFAULT now() - 适用于您的情况