为支持乐观锁定的实体定义表索引的最佳实践是什么?
当然,实体 id 必须是数据库中某些索引的一部分,才能通过 id 进行快速查找。版本列呢?将其作为索引的一部分有意义吗?
如果我们不定义数据库主键,而是创建一个由实体 id + 版本列组成的索引怎么办?在数据库中有两行具有相同实体 ID 的风险?假设两个事务并行保留具有相同实体 ID 的两个实体?
为支持乐观锁定的实体定义表索引的最佳实践是什么?
当然,实体 id 必须是数据库中某些索引的一部分,才能通过 id 进行快速查找。版本列呢?将其作为索引的一部分有意义吗?
如果我们不定义数据库主键,而是创建一个由实体 id + 版本列组成的索引怎么办?在数据库中有两行具有相同实体 ID 的风险?假设两个事务并行保留具有相同实体 ID 的两个实体?
假设您有一个使用版本列定义的实体,如下所示:
@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 列的索引。