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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权力。

原文地址:https://www.cnblogs.com/lyc-code/p/14468683.html