前言

在MySQL中读取数据有两种方式,一种是当前读,另一种是快照读,理解这两种读取数据的方式有助理解更多MySQL相关锁的知识。

当前读

当前读,顾名思义就是读取当前最新的数据,并且对读取的数据加锁,阻止其他事务同时修改相同的记录,避免出现安全问题。
下面这些场景会使用当前读:

  • update、delete、insert
  • select … lock in share mode (主动加共享锁)
  • select … for update (主动加排他锁)

快照读 (一致非锁定读)

A consistent read means that InnoDB uses multi-versioning to present to a query a snapshot of the database at a point in time.

一致读取意味着InnoDB使用多版本控制在某个时间点向查询提供数据库的快照,也可以简称为快照读。
相关说明:

  • InnoDB在隔离级别读已提交级别和可重复读级别上使用
  • 一致读不会在访问的表上加任何锁,其他会话可以同时修改表上的数据。
  • 读已提交级别下,每次select都会生成一个快照。
  • 可重复读级别下,开启事务之后第一个select才会生成快照,而不是事务一开始就生成快照。

快照读的实现方式通过多版本控制MVCC机制实现,感兴趣的小伙伴可以去了解。

小结

  • 可以简单理解需要加锁的是当前读,快照读不需要加锁。
  • 快照读意味每次读取的都是快照,快照意味数据相同。
  • 快照读通过MVCC实现。
  • 快照读在读已提交隔离级别和可重复读隔离级别都有。
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐