问题
数据库MVCC是什么
我的回答
MVCC,全称是"多版本并发控制"(Multi-Version Concurrency Control),是数据库管理系统中常用的一种并发控制技术。说白了,它就是通过维护数据的多个版本,让读操作不会被写操作阻塞,从而提高并发性能。
我觉得理解MVCC最好从它要解决的问题入手。在传统的加锁并发控制中,读会阻塞写,写也会阻塞读,这样并发性能就很差。MVCC巧妙地解决了这个问题,它的核心思想是:读不阻塞写,写也不阻塞读,每个事务看到的都是特定时间点的数据快照。
具体实现上,以MySQL的InnoDB为例,它是这样做的:
首先,InnoDB给每行数据都增加了两个隐藏字段:创建版本号(DB_TRX_ID)和删除版本号(DB_ROLL_PTR)。当事务开始时,会分配一个递增的事务ID。
当事务对数据进行修改时,实际上不会直接修改原数据,而是创建一个新版本,并用老版本构建一个回滚指针,形成一个版本链。原来的数据并不会立即删除,而是标记一个删除版本号。
读操作时,MVCC会根据事务隔离级别和事务ID,从版本链中选择合适的版本来读取。比如在"可重复读"隔离级别下,事务只能读到事务开始前已经提交的数据,以及自己修改但还未提交的数据。
这样设计的好处是显而易见的:读写不冲突,大大提高了并发性能;同时还能实现不同的事务隔离级别,比如"读已提交"、"可重复读"等。
当然,MVCC也有缺点,比如需要额外的存储空间来保存多版本数据,以及定期清理过期版本的开销。但总体来说,它是一种非常优秀的并发控制技术,被MySQL、PostgreSQL等主流数据库广泛采用。