tldr:是否可以创建强制执行的约束:仅当列的当前值为 NULL 时才允许更新列。
当用户采取行动时,我正在使用 Postgresql 将列从 NULL 更新为外键。
理想情况下,它是这样工作的:
- 用户执行操作。
- 如果列是 NULL,做一堆东西并将该列更新为新的外键。否则,跳到 3。
- 使用该列中的外键做某事。
但是,两个用户可以同时执行该操作。在这种情况下,步骤 2 将发生两次,因为对于两个用户,在操作开始时,该列仍然为空。然后,稍微早一点的用户设置的外键以及依赖它的任何东西都会丢失。
如何确保第 2 步只发生一次?是否可以创建一个仅在当前值为空时才允许更新该列的约束?或者,在事务的最后,我应该检查列是否已经设置,然后在服务器级别处理它?
您可能想查看这个问题和这个问题。
这听起来像是数据库中的业务逻辑。另外,当列从一个值(比如说 2)更新回 NULL 时,你会怎么做?如果用户再次将其更改为不同的值(比如 3)怎么办?
您可以创建一个
AFTER UPDATE
引发异常的触发器,但有更好的方法:SELECT ... FOR NO KEY UPDATE
在读取行时使用以防止并发修改(悲观锁定)。使用
REPEATABLE READ
隔离级别,如果有并发更新并且可以重复事务(乐观“锁定”),您将收到序列化错误。