JPA中乐观锁定的表索引/ pk

时间:2013-01-03 02:16:58

标签: java database jpa versioning optimistic-locking

为支持乐观锁定的实体定义表索引的最佳做法是什么?

当然,实体id必须是DB中某个索引的一部分,以便通过id快速查找。版本栏怎么样?将它作为索引的一部分是否有意义?

如果我们不定义数据库主键,但创建一个由实体ID +版本列组成的索引,该怎么办?在具有相同实体ID的DB中有两行的任何风险?假设两个事务持久存在具有相同实体ID的两个实体?

1 个答案:

答案 0 :(得分:1)

假设您有一个使用版本列定义的实体,如下所示:

@Entity
public class MyEntity implements Serializable {    

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @Version
    private Long version;

    //...
}

在更新时,带有@Version注释的字段将递增并添加到WHERE子句中,例如:

UPDATE MYENTITY SET ..., VERSION = VERSION + 1 WHERE ((ID = ?) AND (VERSION = ?))

正如您所看到的,版本列在WHERE子句中使用,但ID列(其上已有索引,因为它是主键)也是如此,所以我不喜欢我认为你会在向VERSION专栏添加索引时看到很多好处。