好的,这是不言自明的架构:
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;
READ COMMITTED
我对(默认)可能发生的情况的“猜测”是:
考虑产品 P,在“伦敦”以 1049 美元的价格出售
- 两笔交易开始
- 他们都考虑他们的行集:T1 将考虑在伦敦销售的所有产品(包括 P),T2 将考虑价格为 1050 美元或更高的产品(不包括 P)
- T1 提交并将 P 的价格设置为 1101 美元,但由于 P 不在 T2 开始时设置的行中,因此没有注意到更改,并且 T2 提交时没有考虑它
如果我没有弄乱定义,那应该是幻读的情况,如果我将 T2 设置为ISOLATION LEVEL REPEATABLE READ