我有一个有限状态机,表示作业的各个阶段。我需要在Postgres数据库中表示这些状态。我想通过禁止从一种状态到另一种状态的更新来执行代码正确性检查,除非状态机允许这样做。
一种实现目标的简单方法是在事务中对表进行“独占锁定”,检查当前状态和下一个状态,并在更新无效时中止并显示错误信息。
这显然会降低性能,因为我每次状态转移都要锁定“Job”表。
是否有一种通过约束实现相同目标的方法?
一种实现目标的简单方法是在事务中对表进行“独占锁定”,检查当前状态和下一个状态,并在更新无效时中止并显示错误信息。
这显然会降低性能,因为我每次状态转移都要锁定“Job”表。
是否有一种通过约束实现相同目标的方法?
create trigger test before update on "Job" for row when (OLD."status" = 'Init' and NEW."status" != 'Queued') execute procedure rollback()
但我宁愿不声明一个rollback
函数。 - Dacav(OLD."status" = 'Init' and NEW."status" != 'Queued')
不会在触发器定义中,而是在函数中。对于被禁止的转换,返回null,这将防止更新(https://www.postgresql.org/docs/9.5/static/plpgsql-trigger.html)。 - Alexey Milogradov