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、排他锁

     s1、s2两个会话共同操作一张表

  s1:select * from table where id=1 for update;

  s2:查询同张表数据没问题select * from table where id=2;

    select * from table where id=2 for update;  此时会报错

3、自增锁:针对自增列自增长的一种锁

  新建了一张表,往这张表中插入10条数据,未commit前回滚了,若此时向表中插入5条数据,id从11开始

4、模拟死锁

mysql的锁机制

 

 图左为s1,图右为s2

①s1、s2先分别对id=1与id=2添加排他锁

②s1中对id=2行添加排他锁,执行

③s2中对id=1行添加排他锁,执行

此时相当于四个锁相互循环锁死,mysql会自动释放锁,这就模拟了死锁的场景

 

mysql的锁机制

上一篇:处理未操作记录的解决方法


下一篇:nagios报错一例