MySQL的快照读和当前读

在MySQL中,快照读(Snapshot Read)和当前读(Current Read)是两种不同的读取方式。

快照读(Snapshot Read)

        快照读是指读取数据时获取的是数据在某个时间点的一致性视图,而不是当前最新的数据。快照读通常用于实现多版本并发控制(MVCC),确保在同一事务中多次读取同一数据时结果一致。

        使用场景:主要用于SELECT语句,不包括FOR UPDATELOCK IN SHARE MODESELECT

当前读(Current Read)

        当前读是指读取数据时获取的是数据的最新版本,同时可能会锁定读取的数据行。

        最新数据:读取的数据是最新的,即当前最新的已提交版本。

        锁机制:会对读取的数据行加锁,以确保数据的一致性,避免其他事务并发修改。

        使用场景:用于需要最新数据并确保数据一致性的场景,如SELECT ... FOR UPDATESELECT ... LOCK IN SHARE MODEUPDATEDELETE等。

使用示例

假设有两个事务A和B同时操作同一个账户记录:

-- 数据库默认事务隔离级别是可重复读
​
sql复制代码-- 事务A开始
START TRANSACTION;
​
-- 事务A进行快照读
SELECT * FROM accounts WHERE id = 1;
-- balance = 100
​
-- 事务B开始
START TRANSACTION;
​
-- 事务B更新账户余额
UPDATE accounts SET balance = 200 WHERE id = 1;
-- balance = 200
-- 提交事务B
COMMIT;
​
-- 事务A进行快照读
SELECT * FROM accounts WHERE id = 1;
-- balance = 100
​
-- 事务A进行当前读
SELECT * FROM accounts WHERE id = 1 FOR UPDATE;
-- balance = 200
​
-- 提交事务A
COMMIT;
总结

快照读和当前读是MySQL中两种重要的读取方式,用于处理并发事务中的数据一致性和隔离性问题。快照读通过多版本控制机制提供一致性视图,适用于大部分SELECT查询,而当前读通过加锁机制确保读取到最新数据,适用于需要最新数据并确保数据一致性的场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值