mysql--表锁

Posted 番茄红了

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql--表锁相关的知识,希望对你有一定的参考价值。

这里写目录标题

特点

偏向myisam存储引擎,开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低

加读锁

前提描述:
  有表1和表2和表3 三个表。给表1加读锁:lock table 表1 read。关掉自动提交(set autocommitt =0)。且有两个链接会话。会话1操作表1,会话2操作表2

操作描述:
  1:会话1select本身----可执行
  2:会话2select表1—可执行
  3:会话1select其他没有锁定的表—不可执行
    原因:表1被锁定了,他做不了操作
  4:会话2select其他没有锁定的表—可执行
  5:会话1执行插入/更新—不可执行
    原因:表1执行插入/更新—不可执行
  6:会话2执行插入/更新—阻塞等待
    原因:表1加了锁,是锁定状态,该状态下其余表无法对其进行非查询的操作。
  解决:会话1释放锁,其余表从阻塞状态释放出来,完成未完成的操作

加写锁

前提描述:
  有表1和表2和表3 三个表。给表1加读锁:lock table 表1 write。关掉自动提交(set autocommitt =0)。且有两个链接会话。会话1操作表1,会话2操作表2

操作描述:
  1:会话1对表1执行查询/更新/插入—可执行
  2:会话2对表1执行查询/更新/插入—不可执行,被阻塞
  原因
    表1是锁定状态,会话2对表1的操作被阻塞了。
    锁表前,如果会话2有数据缓存,锁表后,在锁住的表不发生改变前会话2可以读出缓存数据,如果数据发生改变,缓存会失效,操作会被阻塞
  解决:会话1释放锁,此时会话2则会得到锁,此时的操作即可成功

汇总
  myisam在执行查询语句前,会自动给设计到的所有表加读锁。在执行增删改操作前,会自动给涉及的表加写锁

汇总

  myisam在执行查询语句前,会自动给设计到的所有表加读锁。在执行增删改操作前,会自动给涉及的表加写锁

mysql表级锁模式:
  表共享读锁(table read lock)
  表独占写锁(table write lock)

  加读锁,不会阻塞其他进程对统一标的读请求,但会阻塞对同一表的写请求,只有当读锁释放后,才会执行其他进程的写操作

  加写锁,会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才能执行其他进行的读写操作

  读锁会阻塞写,写锁会阻塞读写

以上是关于mysql--表锁的主要内容,如果未能解决你的问题,请参考以下文章

Mysql:行锁 表锁 乐观锁 悲观锁 读锁 写锁

MySQL 锁

关于mysql数据库引擎MyIsam的表锁理解

说一说MySQL的锁机制

MySQL——innodb锁

MySQL锁机制浅析