我有一个名为Order
它有一个PK id 几列和一个名为active
的bool列以及一列 tableid 。对于 tableid ,两个订单无法同时处于活动状态,这可以通过两列唯一约束(&& active = true)来确保,该约束与索引一样工作并且查找活动订单的速度相当快。
问题是还有另一个表 orderitems 。除非order-id的所有订单都标记为paid = true,否则我希望active为true
使用序列化交易,我认为这可以通过在支付所有项目时设置更新查询来实现支付代码。我认为这不会一直有效。因为如果它们同时运行,它们可能都会看到有未付款的项目(由于旧快照)但是在提交时它们会支付所有项目,但不会更新活动列。(不同)。
添加新项目和支付交易尝试设置active = false将不会成为串行事务的问题,因为其中一个会失败..
我认为触发器是一种解决方案,但我不知道该怎么做......谢谢你的阅读
答案 0 :(得分:2)
您要做的是在AFTER UPDATE OR INSERT OR DELETE FOR EACH ROW
上添加orderitems
触发器,以确定是否应更改Order.active
。您必须在拥有SELECT ... FOR UPDATE
的{{1}}行上执行Order
,否则您将面临并发运行的触发器相互竞争并进行无序更新的风险
假定orderitems
有一个字段orderitems
,它是order_id
的外键引用,请尝试以下代码:(未经测试,仅举例说明)代码:
Order.id