4

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

当然,实体 id 必须是数据库中某些索引的一部分,才能通过 id 进行快速查找。版本列呢?将其作为索引的一部分有意义吗?

如果我们不定义数据库主键,而是创建一个由实体 id + 版本列组成的索引怎么办?在数据库中有两行具有相同实体 ID 的风险?假设两个事务并行保留具有相同实体 ID 的两个实体?

4

1 回答 1

2

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

@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 列的索引

于 2013-01-03T02:54:58.690 回答