热点
深度学习驱动物联网,构建移动互联高效生态,reasoning_content:我们要求以后端站长的口吻,写一个与“技术、科技”相关,关于[深度学习驱动数码物联网革新:打造高效移动互联生态]的标题要求直接输出一个标题,不要加说明;简短精炼,字数控制在30字以内nn注意口吻是后端站长,可以想象成技术博客或站长视角,要体现技术深度、物联网、深度学习、移动互联等关键词标题要吸引人,简洁nn可能的比如深度学习驱动物联网,打造高效移动互联 但字数可能超更精炼:DL赋能物联网:构建高效移动互联生态 但需要检查是否30字内中文一个字算一个字符或者后端站长谈:深度学习引爆物联网新生态 但强调后端站长nn最好直接以站长口吻,可以带站长说或类似但要求简短精炼,可能不需要加站长说直接给出技术标题即可参考:深度学习驱动的数码物联网革新:移动互联新生态 字数:深度学习驱动的数码物联网革新:移动互联新生态 共17个字符?数一下:深(1)度(2)学(3)习(4)驱(5)动(6)的(7)数(8)码(9)物(10)联(11)网(12)革(13)新(14): (15)移(16)动(17)互(18)联(19)新(20)生(21)态(22) 共22个字,符合但可能有点平淡nn更霸气:后端站长:深度学习重构物联网,移动互联生态升级 字数:后端站长:深度学习重构物联网,移动互联生态升级 数一下:后1端2站3长4:5深6度7学8习9重10构11物12联13网14,15移16动17互18联19生20态21升22级 共22字也OKnn但注意标题要直接与给定主题相关给定主题是[深度学习驱动数码物联网革新:打造高效移动互联生态],可以保留核心词nn我倾向于:深度学习赋能数码物联网,打造移动互联新生态 字数:深1度2学3习4赋5能6数7码8物9联10网11,12打13造14移15动16互17联18新19生20态 共20字可以nn或者更符合后端站长口吻:DL+IoT:后端站长眼中的移动互联新生态 但可能不够专业nn建议直接输出简洁标题我选择:深度学习驱动物联网,构建移动互联高效生态 检查字数:深1度2学3习4驱5动6物7联8网9,10构11建12移13动14互15联16高17效18生19态 共19字nn最终答案:深度学习驱动物联网,构建移动互联高效生态
Go模块开发者:MySQL事务控制与高并发优化技巧,reasoning_content:我们要求以模块开发者的口吻,写一个与“技术、科技”相关,关于[Go语言实战:掌握MySQL事务控制与高并发优化技巧]的标题直接输出一个标题,不要加说明提示等信息简短精炼,字数控制在30字以内nn关键点:模块开发者口吻,技术科技相关,标题关于Go语言实战、MySQL事务控制与高并发优化技巧需要简短,30字内nn可能的Go实战:MySQL事务与高并发优化技巧或者更具体:模块开发者必学:Go MySQL事务与高并发优化但要注意口吻是“模块开发者”,可以体现开发者视角nn“模块开发者”可能指的是微服务或模块化开发中的开发者可以写:Go模块开发:MySQL事务控制与高并发优化或者:Go实战:掌握MySQL事务与高并发优化(模块开发者视角)但需要直接输出标题nn尝试:Go开发者的MySQL事务与高并发优化实战但“模块开发者”口吻可能用“模块化开发”更好nn再精简:Go+MySQL:事务控制与高并发优化实战但“模块开发者”口吻不明显nn考虑用“模块开发者”作为主体:模块开发者必备:Go语言MySQL事务与高并发优化字数:模块开发者必备:Go语言MySQL事务与高并发优化(共17字?数一下:模块开发者必备:Go语言MySQL事务与高并发优化——模块(2)开发(2)者(1)必(1)备(1):Go(2)语(1)言(1)MySQL(5)事(1)务(1)与(1)高(1)并(1)发(1)优(1)化(1)——总共?汉字加英文:模块开发者必备:Go语言MySQL事务与高并发优化汉字数:模、块、开、发、者、必、备:、Go、语、言、MySQL、事、务、与、高、并、发、优、化注意“MySQL”算一个单词但通常计为5个字母,但标题字数一般按汉字+英文字母算,但通常要求中文标题可以改为全中文:Go语言MySQL事务控制与高并发优化但需要体现模块开发者nn另一个思路:作为模块开发者,我们可以说“模块化Go实战:MySQL事务控制与高并发优化”字数:模块化Go实战:MySQL事务控制与高并发优化(模块化Go实战:MySQL事务控制与高并发优化——汉字:模、块、化、Go、实、战、:、M、y、S、Q、L、事、务、控、制、与、高、并、发、优、化——共22个字符?但“Go”是英文,“MySQL”也是英文,但通常标题中允许nn更直接:Go实战:MySQL事务控制与高并发优化(模块开发者视角)但可能超过30字?Go实战:MySQL事务控制与高并发优化(模块开发者视角)——Go(2)、实(1)、战(1)、:(1)、M(1)、y(1)、S(1)、Q(1)、L(1)、事(1)、务(1)、控(1)、制(1)、与(1)、高(1)、并(1)、发(1)、优(1)、化(1)、(1)、模(1)、块(1)、开(1)、发(1)、者(1)、视(1)、角(1)——共29个字符?注意括号也算字符可能刚好nn但要求直接输出一个标题,不用说明我可以用最简洁的:Go模块开发者:MySQL事务与高并发优化实战字数:Go模块开发者:MySQL事务与高并发优化实战 (Go模块开发者:MySQL事务与高并发优化实战) 汉字+英文:Go(2)模(1)块(1)开(1)发(1)者(1):(1)M(1)y(1)S(1)Q(1)L(1)事(1)务(1)与(1)高(1)并(1)发(1)优(1)化(1)实(1)战(1) ——共22个字符可以nn或者更短:模块开发者Go:MySQL事务与高并发优化但不太通顺nn考虑到原要求是关于[Go语言实战:掌握MySQL事务控制与高并发优化技巧],所以主题就是Go语言实战,掌握事务控制和高并发优化标题可以变形为:Go实战:MySQL事务控制与高并发优化技巧这个已经28字?Go实战:MySQL事务控制与高并发优化技巧——Go(2)实(1)战(1):(1)M(1)y(1)S(1)Q(1)L(1)事(1)务(1)控(1)制(1)与(1)高(1)并(1)发(1)优(1)化(1)技(1)巧(1) ——共22个字符也不超nn加上“模块开发者”口吻,最好在前面加上“模块开发者:”或者“面向模块开发者”等但30字内可以加nn最终决定:Go模块开发者:事务控制与高并发优化实战——但MySQL没提,需要包含MySQL改为:Go模块开发者:MySQL事务控制与高并发优化——共18个字符?数:Go(2)模(1)块(1)开(1)发(1)者(1):(1)M(1)y(1)S(1)Q(1)L(1)事(1)务(1)控(1)制(1)与(1)高(1)并(1)发(1)优(1)化(1)=22个字符很好nn但原题是“MySQL事务控制与高并发优化技巧”,这里少了“技巧”,但可以省略或者“Go模块开发者:MySQL事务控制与高并发优化技巧”字数:Go模块开发者:MySQL事务控制与高并发优化技巧——多“技巧”两字,共24字符可以nn我认为最合适的:Go模块开发者:MySQL事务与高并发优化实战或者“Go实战:模块开发者必备MySQL事务与高并发优化”可能超过nn我选择:Go模块开发者:MySQL事务控制与高并发优化技巧输出即可
16 9 月 2026, 周三

MySQL之InnoDB中锁的情况介绍

这篇文章主要讲解了“MySQL之InnoDB中锁的情况分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL之InnoDB中锁的情况分析”吧!

MySQL之InnoDB中锁的情况分析
mysql> select @@version;
+———–+
| @@version |
+———–+
| 5.7.21    |
+———–+
1 row in set (0.01 sec)

一,锁的基本介绍
相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

二,锁的分类
共享锁 Share Locks (简称S锁,属于行锁)

排它锁 Exclusive Locks (简称X锁,属于行锁)

意向共享锁 Intention Share Locks (简称IS锁,属于表锁)

意向排它锁 Intention Exclusive Locks (简称IX锁,属于表锁)

自增锁 AUTO-INC Locks(属于表锁)

下面具体介绍下每种类型的锁,我们先建一张innodb的表,sql如下
create table tab_with_index(id int,name varchar(10)) engine=innodb;
alter table tab_with_index add index id(id);
insert into tab_with_index values(1,'1'),(2,'2'),(3,'3'),(4,'4');

共享锁
共享锁就是多个事务对于同一个数据可以共享一把锁,都能访问数据库,但是只能读不能修改;

事务A:

select * from tab_with_index lock in share mode;

事务B:

select * from tab_with_index where id =1; // 可以查询数据

update tab_with_index set name = 'aa' where id = 1 ;

注意:这里的修改语句会堵塞住,直到事务A提交之后才能操作成功。

排它锁
排它锁不能与其他锁并存,如一个事务获取了一个数据行的排它锁,其他事务就不能在获取该行的锁,只有当前获取排它锁的事务可以对数据进行修改。(delete,update,create默认是排它锁)

事务A:

select * from tab_with_index where id =1 for update;

事务B:

select * from tab_with_index where id =1; //可以获取结果

select * from tab_with_index where id =1 for update; // 堵塞

select * from tab_with_index where id = 1 lock for share mode; // 堵塞

注意:事务B两个sql都会堵塞住,也就是获取不到共享锁也获取不到排它锁,直到事务A提交之后才能操作成功。

意向共享锁和意向排它锁

意向共享锁:表示事务准备给数据行加入共享锁,也就是说一个数据行在加共享锁之前必须先获取该表的IS锁。

意向排它锁:表示事务准备给数据行加入排它锁,也就是说一个数据行加排它锁之前必须先获取该表的IX锁。

IS锁和IX锁是表级锁,他们的提出仅仅为了在之后加表级别的S锁和X锁时可以快速判断表中的记录是否被上锁,以避免用遍历的方式来查看表中有没有上锁的记录,也就是说其实IS锁和IX锁是兼容的,IX锁和IX锁是兼容的。 

自增锁
针对自增列自增长的一个特殊的表级别锁。

show variables like 'innodb_autoinc_lock_mode'; 
— 默认值1,代表连续,事务未提交则ID永久丢失

三,InnoDB锁
1、事务及其ACID属性

事务是由一组SQL语句组成的逻辑处理单元,事务具有4属性,通常称为事务的ACID属性。

原子性(Actomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。 一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。 隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。 持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。

2、并发事务带来的问题

相对于串行处理来说,并发事务处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量,从而可以支持更多用户的并发操作,但与此同时,会带来一下问题:

脏读: 一个事务正在对一条记录做修改,在这个事务并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”的数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做“脏读”

不可重复读:一个事务在读取某些数据已经发生了改变、或某些记录已经被删除了!这种现象叫做“不可重复读”。

幻读: 一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读”

数据库的事务隔离越严格,并发副作用就越小,但付出的代价也就越大,因为事务隔离本质上就是使事务在一定程度上串行化,需要根据具体的业务需求来决定使用哪种隔离级别。

脏读    不可重复读    幻读
read uncommitted    √    √    √
read committed    
√    √
repeatable read    


serializable    

可以通过检查InnoDB_row_lock状态变量来分析系统上的行锁的争夺情况:

mysql> show status like 'innodb_row_lock%';
+——————————-+——-+
| Variable_name                 | Value |
+——————————-+——-+
| Innodb_row_lock_current_waits | 0     |
| Innodb_row_lock_time          | 18702 |
| Innodb_row_lock_time_avg      | 18702 |
| Innodb_row_lock_time_max      | 18702 |
| Innodb_row_lock_waits         | 1     |
+——————————-+——-+
–如果发现锁争用比较严重,如InnoDB_row_lock_waits和InnoDB_row_lock_time_avg的值比较高

3、InnoDB的行锁模式及加锁方法

共享锁(S) :又称读锁(lock in share mode)。允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。  排他锁(X) :又称写锁(for update)。允许获取排他锁的事务更新数据,阻止其他事务取得相同的数据集共享读锁和排他写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。

mysql InnoDB引擎默认的修改数据语句:update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select …for update语句,加共享锁可以使用select … lock in share mode语句。所以加过排他锁的数据行在其他事务中是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select …from…查询数据,因为普通查询没有任何锁机制。

4、InnoDB行锁实现方式

InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

感谢各位的阅读,以上就是“MySQL之InnoDB中锁的情况分析”的内容了,经过本文的学习后,相信大家对MySQL之InnoDB中锁的情况分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。

dawei

【声明】:郑州站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

您错过了

深度学习驱动物联网,构建移动互联高效生态,reasoning_content:我们要求以后端站长的口吻,写一个与“技术、科技”相关,关于[深度学习驱动数码物联网革新:打造高效移动互联生态]的标题要求直接输出一个标题,不要加说明;简短精炼,字数控制在30字以内nn注意口吻是后端站长,可以想象成技术博客或站长视角,要体现技术深度、物联网、深度学习、移动互联等关键词标题要吸引人,简洁nn可能的比如深度学习驱动物联网,打造高效移动互联 但字数可能超更精炼:DL赋能物联网:构建高效移动互联生态 但需要检查是否30字内中文一个字算一个字符或者后端站长谈:深度学习引爆物联网新生态 但强调后端站长nn最好直接以站长口吻,可以带站长说或类似但要求简短精炼,可能不需要加站长说直接给出技术标题即可参考:深度学习驱动的数码物联网革新:移动互联新生态 字数:深度学习驱动的数码物联网革新:移动互联新生态 共17个字符?数一下:深(1)度(2)学(3)习(4)驱(5)动(6)的(7)数(8)码(9)物(10)联(11)网(12)革(13)新(14): (15)移(16)动(17)互(18)联(19)新(20)生(21)态(22) 共22个字,符合但可能有点平淡nn更霸气:后端站长:深度学习重构物联网,移动互联生态升级 字数:后端站长:深度学习重构物联网,移动互联生态升级 数一下:后1端2站3长4:5深6度7学8习9重10构11物12联13网14,15移16动17互18联19生20态21升22级 共22字也OKnn但注意标题要直接与给定主题相关给定主题是[深度学习驱动数码物联网革新:打造高效移动互联生态],可以保留核心词nn我倾向于:深度学习赋能数码物联网,打造移动互联新生态 字数:深1度2学3习4赋5能6数7码8物9联10网11,12打13造14移15动16互17联18新19生20态 共20字可以nn或者更符合后端站长口吻:DL+IoT:后端站长眼中的移动互联新生态 但可能不够专业nn建议直接输出简洁标题我选择:深度学习驱动物联网,构建移动互联高效生态 检查字数:深1度2学3习4驱5动6物7联8网9,10构11建12移13动14互15联16高17效18生19态 共19字nn最终答案:深度学习驱动物联网,构建移动互联高效生态