【发布时间】:2016-12-21 03:41:41
【问题描述】:
根据这个wikipedia entry,可重复读隔离级别在选择数据时持有读写锁。
我的理解是,这可以防止古老的银行业务示例:
- 开始交易
- 获取 (SELECT) 帐户余额 ($100)
- 提取 10 美元并更新新价值 (90 美元)
- 提交事务
如果在 2 和 3 之间,客户收到了 1000 美元的押金,则该交易应该被阻止,因为在第 2 步中获得了读/写锁。否则,第 3 步将写入 90 美元而不是 1090 美元。
但是,根据MySQL docs,可重复读取(默认)的工作方式不同。它所确保的是,无论我们执行多少次 SELECT,我们都会获得相同的值,无论该值是否已被另一个事务更改。也允许其他事务修改我们读取的值。
这听起来很糟糕,不知道我为什么要阅读旧的天平。该文档说需要将显式 FOR UPDATE 添加到 SELECT 以获取适当的锁。
我对可重复读取的定义和实现感到困惑。有人能澄清一下银行问题是如何解决的吗?
【问题讨论】:
-
在这种情况下您不会使用可重复读取...事实上,如果您在事务中使用可重复读取是没有意义的。可重复读取用于“绕过”其他人更改数据,而您不想锁定,但您也不想更改数据。
-
当您创建一个您希望在某个时间点保持内部一致性的报告时,可重复读取非常有用。如果您要更新银行帐户,则不是很有用。
标签: mysql sql transactions locking