与其他数据库相比,MySQL的锁定机制相对简单。最重要的功能是不同的存储引擎支持不同的锁定机制。例如,Myisam和存储器存储引擎使用表级锁定;InnoDB存储引擎都支持两个行级锁定,但也支持表级锁,但默认情况下
表 - 级别锁:小顶部,快速锁;没有僵局;大锁定粒径,锁定冲突的最高概率和最低的并发。
行 - 级锁:巨大的费用,缓慢的锁;死锁;最小锁定粒径,锁定冲突的最低概率和最高并发性。
线 - 级锁类型:记录锁
记录锁仅锁定索引记录。如果建立InnoDB存储手表没有任何索引,则此锁将使用隐藏的主键锁定,如下图所示
差距锁(差距锁):锁定范围,不包括记录本身(仅数据前面的缝隙)
下图中的锁定是差距锁,不允许在索引列8之间的间隙之前插入新记录插入幻影记录。
Next-key锁:同时,锁定记录和记录的上一个差距,即下一个键锁=记录锁定 +间隙锁。
共享锁共享锁(称为S锁,属于线路锁)
消除其锁的独家锁(称为X锁,属于线路锁)
意图共享锁定意图共享锁
智力独家锁定探索锁(称为IX锁,属于锁)
自动锁(属于锁)自我进口锁锁
以下专门引入了每种类型的锁。
共享锁定锁定是多次交易可以共享锁定并访问数据库的同一数据,但是您只能读取并不能对其进行修改。
事务A:
在共享模式下选择 *来自TAB_WITH_INDEX锁定;
事务b:
从tab_with_index中选择 *,其中id = 1;//您可以查询数据
更新tab_with_index设置名称='aa'其中id = 1;
注意:此处的修改后的语句将被阻止,直到提交交易A之前,它将不会成功。
它不能与其他锁一起使用其他锁。如果事务获得锁的数据行,其他交易将无法获得线路的锁定。只有当前获得其锁定的当前交易才能通过数据修改。(删除,更新,创建默认值以锁定它)
事务A:
从tab_with_index中选择 *,其中ID = 1以供更新;
事务b:
从tab_with_index中选择 *,其中id = 1;//可以得到结果
从tab_with_index中选择 *,其中ID = 1以供更新;//阻塞
选择 *来自tab_with_index其中id =共享模式的1个锁定;//阻塞
注意:事务B的两个SQL都将被阻止,也就是说,它将无法获得共享锁,并且不会排出。在提交交易A之前,它无法成功操作。
意图共享锁定和意向锁定意图共享锁:表示事务准备准备在数据行中添加共享锁定,这意味着数据线必须在共享锁之前获得表的IS锁定。
意图行IT锁定:表示事务准备将其锁定添加到数据行中,这意味着可以在锁定之前获得数据行。
是锁,IX锁是桌子级别的锁。他们的建议可以快速确定表格中的记录是否可以在添加s锁定和x锁时锁定,以避免使用遍历的路,也就是说,锁定是锁定的,ix锁兼容,ix锁和ix锁和ix锁兼容。“ mySQL如何运行”
自我提示的锁是一个特殊的表面锁,用于自我提高自我灌输的生长。
1.事务及其酸属性
事务是由一组SQL语句组成的逻辑处理单元。交易具有4个属性,通常称为交易的酸属性。
原子性:事务是一个原子操作部门。数据的修改,无论是所有执行还是所有执行。不受外部并发操作的影响。可耐用:交易完成后,该数据将由数据永久修改,即使发生系统故障发生,也可以维持它。
2.并发交易带来的问题
与串行处理相比,并发交易处理可以大大增加数据库资源的利用率并增加数据库系统中的交易量,以支持更多用户的并发操作,但同时,它将带来一个问题:
肮脏的阅读:一项交易正在修改一个记录。在提交此交易之前,此记录的数据处于不一致的状态;目前,还可以读取另一笔交易。阅读这些“肮脏”数据以进行单个交易,并进行相应的处理,它将产生不保密的数据依赖项。这种现象被生动地称为“肮脏的阅读”。
重复阅读:阅读某些数据时已更改了一项交易或某些记录已被删除!此现象称为“重复阅读”。
幻影阅读:一项交易读取根据相同查询条件之前检索到的数据,但发现其他交易插入了满足其查询条件的新数据。这种现象称为“幻觉阅读”
上面提到的问题是数据库读数一致性的问题,可以通过交易的隔离机制来保证。
更严格的数据库隔离,侧面的副作用越小,但是付费的价格越大,因为交易隔离本质上是在一定程度上序列化交易。
读取未投入的√√√√读取所承诺的√√截止性可读取√序列化可以通过检查innodb_row_low_low_lock状态变量来分析系统锁上的行锁。
3. InnoDB的线路锁定模式和锁定方法
共享锁定:也称为共享模式中的锁。允许一项交易读取一条线以防止其他交易将其锁定在同一数据集中。如果事务t将s锁添加到数据对象a,交易可以读取一个但是无法修改A.只能将其他交易添加到A上的锁中,而不是添加X锁,直到t释放s锁定。锁定A.ROW(x)的s锁:也称为更新。允许其锁的事务更新数据,以防止其他交易获得相同的数据集共享锁定和锁定锁。如果交易t添加x锁对于数据对象A,事务t可以读取或修改A,其他交易不能向A添加任何锁,直到t释放A上的锁。
MySQL InnoDB引擎默认修改数据语句:更新,删除,插入将自动添加所涉及的锁,并且SELECT语句将不会默认添加任何锁定类型。,他的锁定锁的数据不能在其他事务中修改,您也不能通过在共享模式下进行更新和锁定的方式查询数据,但是您可以直接通过选择...一般查询机构中没有常见的查询。
4. InnoDB线路锁实现方法
通过将索引项目锁定在索引上,可以实现InnoDB锁定。这与Oracle不同,Oracle可以通过将相应的数据行锁定在数据块中来实现。INNODB的行锁实现特性意味着仅通过索引条件仅使用线路级别的锁,否则,InnoDB将使用表锁!
1.当不查询索引条件时,InnoDB使用表锁定而不是线路锁
添加了锁,但是当Session2要求其他行锁定他时,将会有一个锁等待。原因是在没有索引的情况下,InnoDB只能使用表锁。
2.创建带有条件查询索引的表,InnoDB使用线路锁
对于索引的锁定,它不是记录的锁定,因此,尽管它是不同行的记录,但仍然无法访问特定数据(这是一个表锁)
,但是锁是一个特定的表格,因此您需要等待InnoDB表的锁。本文主要讨论以下内容:(1)InnoDB的锁定基于索引。在不同的隔离级别中,效果(2)InnoDB的锁定机制和一致性阅读策略是不同的。
了解InnoDB锁定后,用户可以通过设计和SQL调整来减少锁定冲突和死锁,包括:
我是JI先生。我继续学习强制输入。我继续分享技术的技术,整个网络值得收集得很好。欢迎注意公共帐户并成为一个持续的增长技术人员。
MySQL高级历史文章系列(还可以在“掘金”列中阅读其他相关文章)
1. MySQL高级系列:一篇文章了解MySQL基础架构;
2. MySQL高级系列:一篇文章了解MySQL存储引擎;
3. MySQL高级系列:MySQL中的Myisam和InnoDB有什么区别;
4. MySQL高级系列:如何在MySQL设计中选择数据类型;
5. MySQL高级系列:如何在数据库设计中使用范例;
6. MySQL高级系列:一篇文章详细说明了解释的每个领域的含义;
7. MySQL高级系列:为什么MySQL使用B+作为索引的数据结构;
8. MySQL高级系列:您需要了解的一些索引基础知识;
9. MySQL高级系列:如何创建索引更合适;
10. MySQL高级系列:主要副本的原理和配置;
11. MySQL高级系列:Join-3算法原理;
12. MySQL高级系列:事务和交易隔离级别;
13. MySQL高级系列:多转换同时控制MVCC的实现;
14. MySQL高级系列:如何执行SQL;
15. MySQL高级系列:您需要了解的几个MySQL日志;
16. MySQL高级系列:MySQL主副本和原理;
17. MySQL高级系列:Mysql-Myisam章节中的锁;
原始:https://juejin.cn/post/7112694846044946446