mysql的锁机制
MyISAM和MEMORY存储引擎采用的是表级锁,InnoDB存储引擎既支持行级锁又支持表级锁
一、MyISAM表锁
MySQL的表级锁有两种模式:表共享读锁和表独占写锁
1、对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求
注意:
①有两个session,s1和s2,当s1中添加了表共享读锁时,s1会话中也不可以进行新增、修改操作
②当s1会话中对某张表上了表共享读锁后,在s1会话中去查未上表共享读锁的表数据会报错
2、对MyISAM表的写操作,会阻塞其他用户对同一表的读和写操作
二、InnoDB的行锁模式及加锁方法
注意:
InnoDB行锁是通过给索引上的索引项加锁来实现的,若表中无索引,则会进化为表级锁
1、共享锁:能进行读操作,不能进行写操作
详细解释:多个事务对于同一数据可以共享一把锁,都能访问到数据库,但是只能读不能修改
s1、s2两个会话共同操作一张表
s1:select * from table where id=1 lock in share model;
s2:select * from table where id=2; 可以正常查询
s2:update table set name='111' where id=1; 此时不能进行修改操作
2、排他锁:A事务中a行加了排他锁,B事务对a行加共享或排他锁都不能执行
详细解释:排他锁不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取行的锁,只有当前获取了排他锁的事务可以对数据进行读取和修改
s1、s2两个会话共同操作一张表
s1:select * from table where id=1 for update;
s2:查询同张表数据没问题select * from table where id=1;或select * from table where id=2;
若执行select * from table where id=2 for update; 此时会报错
3、自增锁:针对自增列自增长的一种锁
新建了一张表,往这张表中插入10条数据,未commit前回滚了,若此时向表中插入5条数据,id从11开始
4、模拟死锁
图左为s1,图右为s2
①s1、s2先分别对id=1与id=2添加排他锁
②s1中对id=2行添加排他锁,执行
③s2中对id=1行添加排他锁,执行
此时相当于四个锁相互循环锁死,mysql会自动释放锁,这就模拟了死锁的场景
作者:http://cnblogs.com/lyc-code/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权力。