Mysql数据库锁模块之MyISAM与InnoDB关于锁方面的区别

MyISAM与InnoDB关于锁方面的区别是什么?

MyISAM默认用的是表级锁,不支持行级锁

InnoDB默认用的是行级锁,也支持表级锁

注:MyISAM与InnoDB存储引擎都是针对某张具体表而言的,而非数据库级别的


MyISAM表级锁

首先准备两个数据库的session(会话),这里用sessionA和sessionB来表示,来对同一张表进行操作


先上读锁(默认共享锁)情况:

首先sessionA先去执行一个select查询操作:


情况1:此时sessionB去执行一个更改数据(增、删、改)的操作,会发现sessionA的查询操作未执行完之前,sessionB的更改操作是等待状态,无法执行的(不再支持上排它锁)




情况2:此时sessionB去执行一个select查询操作,会发现sessionA的查询操作未执行完之前,sessionB的查询操作是不受影响的,独立执行的,这就是为什么读锁也叫默认共享锁(支持上其他共享锁)



先上写锁(排他锁)情况:

首先sessionA先去执行一个select查询操作:


此时sessionB去执行一个查询操作或者更改数据(增、删、改)的操作,会发现sessionA的查询操作未执行完之前,sessionB的操作是等待状态,无法执行的(不再支持上其他锁)



显示的手动对一个表的读操作加读锁、释放锁:


加读/写锁:lock tables 表名 read/write;

释放锁:unlock tables;

1

2

InnoDB行级锁

首先InnoDB采用的是二段锁

二段锁:加锁和解锁是分别来执行的,对一个事务里的一批sql操作加锁,等到事务提交的时候,再进行所有解锁


要演示这个先将两个session的事务自动提交关闭


show variables like 'autocommit';#查看当前是否开启自动提交事务,默认开启

set autocommit = 0;#关闭默认提交,关闭之后,事务需要手动commit,并且设置只对当前session有效

commit;#提交事务



演示InnoDB为行级锁,sessionA和sessionB就对同一张表的同一行进行操作


先对sessionA执行select操作,但是不commit,然后对sessionB进行update/insert/delete操作,发现sessionB竟然能够执行成功,这不符合在行级别加了共享锁之后,不能再加排它锁的规律,其实这里需要注意,这里sessionA的select操作并未加共享读锁,这是InnoDB对select进行了优化(非阻塞select),这里需要显示的加上共享读锁


select......lock in share mode;//加共享锁

1

此时再对sessionA执行select操作,但是不commit,然后对sessionB进行update/insert/delete操作,发现sessionB不能够执行需要等待,当sessionA执行commit之后,释放锁,此时sessionB方可执行


如果sessionA和sessionB操作的是不同行,不论sessionA是加的共享锁还是排它锁,都不影响sessionB的独立操作,因此也证明InnoDB默认行级锁


InnoDB中其他锁情况和MyISAM中也符合相同规律,不同的就是InnoDB默认行级别,MyISAM有且只有表级别


InnoDB在什么情况下行锁会升级为表锁?郑州不孕不育 医院:http://jbk.39.net/yiyuanfengcai/tsyl_zztjyy/3030/

当操作sql没有走索引(没有走索引或者索引失效),此时就会走表锁,两个数据库session分别操作同一张表中不同的数据行,还是会受共享锁和排它锁之间兼容性的限制

郑州不孕不育治疗:http://www.zzfkyy120.com/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章