事务的隔离性(InnoDB存储引擎的并发控制)

本文深入探讨了InnoDB存储引擎如何通过锁机制实现事务的隔离性,包括共享/排他锁、意向锁及其作用,以保证数据的完整性和一致性。此外,文章还介绍了多版本并发控制(MVCC)机制,以及四种并发访问问题(覆盖修改、读脏数据、不可重复读、读幻象)及其解决方案。
摘要由CSDN通过智能技术生成

一、四种并发访问问题

 

 

一、锁机制

1、锁的概述

InnoDB存储引擎中,事务的隔离性主要是由锁机制实现的。开发多用户的应用,很大的一个难点就在于并发访问:一方面既要最大程度地实现数据库的并发访问,另一方面又要确保每个用户能以一致的方式读取、修改数据,为此,我们需要锁机制。

锁机制是数据库系统区别于文件系统的另一个关键特性,锁机制用于管理对共享资源的并发访问,保证数据的完整性和一致性。这里的共享资源不仅仅是行数据,还包括缓冲池中的LRU列表,删除、添加、移动LRU列表中的元素时,有需要锁来保证一致性。

2、锁的类型

(1)共享/排他锁

MySQL提供了两种锁的粒度:行级锁、表级锁。一般而言,锁的粒度越小,并发度越高;锁用得越多,开销越大(锁的各种操作如获取锁、释放锁、检查锁状态等都会增加系统开销)。因此我们通常只锁定尽可能少的数据量,另外我们需要在锁开销和并发度之间找好平衡点。

InnoDB存储引擎提供两种行级锁:

共享锁(S Lock):允许事务读一行数据;

排他锁(X Lock):允许事务删除或更新一行数据。

如果事务T1已经获得行r的共享锁,那么事务T2可以立即获得行r的共享锁以读取数据(锁兼容);如果事务T1已经获得行r的共享锁/排他锁,那么事务T2要想获得行r的排他锁/共享锁或排他锁必须等待事务T1释放锁(锁不兼容)。共享锁和排他锁均用在事务中,随着事务的结束而释放。

(2)意向锁

InnoDB存储引擎支持意向锁的锁方式以实现多粒度锁定功能,所谓的多粒度锁定就是允许事务在行级上的锁和表级上的锁同时存在。意向锁在原来的 X/S 锁之上引入了两种表锁 IX/IS 锁:

意向共享锁(IS Lock),事务有意向获得一张表中某几行的共享锁;

意向排他锁(IX Lock),事务有意向获得一张表中某几行的排他锁

意向锁机制的工作方式:意向锁将锁定的对象分为多个层次(InnoDB存储引擎分为表级、行级两个层次),要想对最下层的对象(最细粒度的对象,行)上锁,需要先对上层对象上锁(粗粒度的对象,表)。也就是说,1)事务要想获得某些行的S锁,必须先获得表的IS锁; 2)事务要想获得某些行的X锁,必须先获得表的IX锁。 而获得各种锁的兼容性如下图所示:


从上图可以看出:意向锁之间始终是兼容的,表级的共享/排他锁之间的兼容性则跟前面行级的共享/排他锁之间的兼容性一样,至于意向锁与表级的共享/排他锁之间则是我们关注的重点,这也是意向锁机制存在的意义。我们可以看到,排他锁是很强的锁,不与其他类型的锁兼容。而修改和删除某一行的时候,必须获得强锁,禁止这一行的其他并发,以保障数据的一致性。

不过问题来了,按理说即时没有意向锁机制,只存在行级锁和表锁,那么在并发修改和删除时,也是可以保证数据的一致性的。比如事务T要给表A加X锁,它会判断此时是否存在其他事务已经获得表A的表锁 或者 已经获得表A的任意一行的锁,如果存在,则事务T阻塞直

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值