我们有一个简单的表格:
Human:
+------+
|Height|
+------+
| |
+------+
我有一个添加人类的方法:
@AutoWired
HumanRepository humanRepo; // JpaRepository
@Transactional(isolationLevel = REPEATABLE_READ)
void addHuman(int height){
if(humanRepo.existsByHeight(height){
throw new HumanWithSuchHeightExists();
}
humanRepo.save(Human.builder().height(height).build())
}
我想保证只存在一个具有特定身高的男人。
REPEATABLE_READ
能保证吗?答案 0 :(得分:1)
理论说唯一能够绝对保证的等值水平。数据完整性(wrt声明的规则)是SERIALIZABLE。
使用REPEATABLE READ,理论上你仍然面临两个事务试图插入同一行的风险,以及允许传递的以下事件序列:
T1检查存在行,行不存在REPEATABLE READ,正如名称所述,仅提供与现有行相关的保证(即如果发现存在行,则不会被更改通过其他交易,然后读取变得“可重复”)。
答案 1 :(得分:0)
是的,PostgreSQL SERIALIZABLE应该防止创建多个具有相同高度的记录。它将中止T1或T2。
我认为该异常现象被正式称为“反依赖性周期”(G2)。这是good reference that includes major databases
此外,为什么不使用unique constraint呢?