MySQL中大对象的多版本并发控制详解
在 MySQL 中,大对象(LOB)指的是二进制数据或者文本数据,它的存储方式与表中的其他字段不同。在使用大对象字段进行多表连接或者并发更新的时候,有可能会出现数据并发问题。因此,MySQL 中采用多版本并发控制(MVCC)机制来保证大对象的数据一致性和可靠性。
MVCC机制是什么
多版本并发控制(MVCC)是指为了解决并发过程中的读写问题,数据库对同一个数据进行多版本维护并使用非锁定读,从而避免了锁等待和死锁的情况。在 MVCC 机制中,并发事务读取数据时,不会阻塞正在修改同一数据的事务。
在 MySQL 中,MVCC机制是通过存储行版本来实现的。每当一个事务修改一行的时候,MySQL 会为其创建一个新版本,并将修改后的数据存储在版本中。在查询数据时,MySQL 会根据当前事务的隔离级别,只查询符合当前隔离级别要求的行版本。
使用MVCC机制的好处
- 降低锁等待和死锁风险
- 并发事务不会阻塞正在修改同一数据的事务
- 提高并发访问性能
MVCC机制在LOB中的应用
在 MySQL 中,LOB对象的数据会被存储在不同的表空间中。在进行多表连接时,MVCC 机制会通过多版本维护来保持数据的一致性和可靠性。
MVCC 机制使用类似时间戳的机制,会为每个修改记录生成一个版本号(undoID)。对于 longblob 类型的数据,MySQL 其实是将这个数据保存在了一张单独的表 (mysql.rtmp_table
) 中,并将对的 row_id
记录下来。在加载 longblob 时,是根据这个记录去查询 mysql.rtmp_table 获取其二进制数据。
由于 longblob 数据是以一个独立的表存放的,所以与其相关的 undo log 也是多张表的联合。因此在执行多表关联时,一个事务所能看到的 undo log 数据是与事务处理的查询有关的 undo log 数据。
示例1
假设有一张 orders
表和一张 order_details
表,其中 order_details
表存储了每个订单的商品明细。这两张表使用 longblob 字段存储了图片。
现在有两个并发的事务,分别需要更新 orders
表中的一行数据和 order_details
表中的一行数据。如果不使用 MVCC 机制,则有可能会出现锁等待和死锁的情况。
使用 MVCC 机制,MySQL 会为每个事务生成一个版本号,在修改数据时不会阻塞正在修改同一数据的事务,从而避免了锁等待和死锁的情况。
示例2
假设有一张存储文章内容的表 articles
,其中包含了大量的二进制图片数据。现在有多个并发事务需要同时读取这些文章数据,如果不使用 MVCC 机制,则可能会出现数据并发问题。
使用 MVCC 机制,MySQL 会对每个事务的读操作生成一个快照,同时读取对应的快照版本,从而避免了数据并发问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL中大对象的多版本并发控制详解 - Python技术站