gpt4 book ai didi

数据库 : atomic triggers

转载 作者:搜寻专家 更新时间:2023-10-30 23:08:22 24 4
gpt4 key购买 nike

我有:假设我有一个表:Info 包含列 personIdlaptopId价格

Taks:如果个人笔记本电脑的价格摘要超过某个常量,则阻止插入到 Person 表中。

糟糕的解决方案:添加触发器

问题:该解决方案不是原子的。我的意思是在触发器检查条件和我们继续执行 INSERT 之间可能会执行另一个操作。

问题:如何使其成为线程安全的方式?

最佳答案

假设您在 Info 上创建了一个物化 View 日志,您可以创建一个在提交时进行快速刷新的物化 View

CREATE MATERIALIZED VIEW mv_check_totals
REFRESH FAST
ON COMMIT
AS
SELECT personID,
sum( price ) total_price
FROM info
GROUP BY personID
HAVING sum( price ) > <<some constant>>

然后您可以在此物化 View 上创建一个约束,如果任何行出现在物化 View 中,该约束将被违反

ALTER TABLE mv_check_totals
ADD CONSTRAINT constraint_name
CHECK( personID IS NULL )

有了这个,总价将在提交时检查。您将被允许 INSERT 任意多的行(毕竟,其他人可能会在一个单独的 session 中删除现有的行,该 session 将在您执行之前提交)。但是如果更改违反您的业务规则,您将无法提交更改。这非常类似于延迟约束的行为。但它确实需要更智能的应用程序来识别提交失败并提醒用户这一事实,而不是仅仅报告特定 INSERT 上的错误。

在此实现中,我将常量放在物化 View 定义中,以便在满足业务规则时物化 View 将为空。这避免了存储总数的成本。但是,您可能希望省略 HAVING 子句并将常量放入约束中。这意味着您正在存储额外的数据。但这使得将来更改常量变得更容易。如果这是您要在报告中展示的东西,它会为每个人实现 total_price

关于数据库 : atomic triggers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23279675/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com