【发布时间】:2019-09-05 10:36:39
【问题描述】:
好的,这是不言自明的架构:
STORE(storeID, name, city)
PRODUCT(productID, name, brand)
PRODUCT_FOR_SALE(productID, storeID, price)
我有 2 笔交易:T1 和 T2。T1 将“伦敦”任何商店出售的任何产品的价格提高 5%。T2 降低成本 >= 1050 美元的任何产品的价格降低 10%
我的要求是说明它们可能导致什么样的并发异常,以及我应该将什么隔离级别应用于哪个事务以使其安全。
没有给出交易代码,但我想应该是这样的:
# T1:
BEGIN;
UPDATE product_for_sale
SET price = price + ((price/100) *5)
WHERE storeID IN (SELECT storeID FROM store WHERE city='London')
COMMIT;
# T2:
BEGIN;
UPDATE product_for_sale
SET price = price - (price/10)
WHERE price >= 1050
COMMIT;
我对@987654325@(默认)可能发生的事情的“猜测”是:
考虑产品 P,在“伦敦”以 1049 美元的价格出售
- 两个事务开始
- 他们都考虑他们的行集:T1 将考虑在伦敦销售的所有产品(包括 P),T2 将考虑价格为 1050 美元或更高的产品(不包括 P)
- T1 提交并将 P 的价格设置为 1101 美元,但由于 P 不在 T2 开始时设置的行中,因此没有注意到更改,并且 T2 提交时没有考虑它
如果我没有弄乱定义,这应该是幻读的情况,如果我将 T2 设置为 ISOLATION LEVEL REPEATABLE READ 将得到修复
【问题讨论】:
标签: postgresql concurrency transactions isolation repeatable-read