我正在尝试了解 SQL Server 版本存储和相关的隔离级别。据我了解,当数据库启用读取提交快照选项时,可能会发生这种情况:
- 一个项目 (id = 1) 在数据库中的价格为 $1000
- 会话 1 启动更新语句:
update products set price = price * 1.5
. 由于这涉及表格的所有行,因此需要很长时间。 - 当
update
语句仍在进行中时,会话 2 开始查询:select * from products where id = 1
。由于数据库处于读取提交快照模式,因此写入者不会阻塞读取者。所以会话 1 从版本商店读取了该行的旧版本,并认为该产品的价格为 1000 美元。 - session 1的用户觉得价格还不错,所以决定买。但 ...
- 在用户将产品添加到他的购物车之前,上述
update
语句执行完毕,产品 (id = 1) 的新价格为 1500 美元。如果用户知道产品的新价格,他就不会购买。
在这种情况下,会发生什么?这种情况真的可能吗?如果是这样,防止这种情况的规范是什么?