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/