Mysql 读写锁保姆级图文教程
摘要:读锁会阻塞写,但是不会阻塞读,而写锁会把杜希俄都阻塞。
本文分享自华为云社区《Mysql保姆级读写锁图文教程丨【绽放吧!数据库】》,作者:Code 皮皮虾 。
准备
创建 mylock 表
一、读锁
读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。
共享锁又称为读锁,简称 S 锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。
1.运行 showopen tables,可见 In_use 全为 0 即没有加过锁,为 1 表示有锁。
2.运行 locktable mylock read,lagou write 加锁后,show open tables 可见加锁成功。
运行 unlock tables 释放锁。
3.开启两个查询,在 session1 加读锁 lock table mylock read
都可查询成功。
4.在 session2 读任何表都不会受影响
5.在 session1 中查询其他表或更新表都不行。
6.在 session2 中更新表,则会阻塞。
二、写锁
写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。
排他锁又称为写锁,简称 X 锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。
先 unlock tables 释放锁,再在 session1 运行 locktable mylock write 加写锁
1.在 session1 中更新成功
但查询失败
2.在 session2 中查询会阻塞
三、总结
Mylsam 在执行查询语句(select)前,会自动涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。
MYSQL 的表级锁有两种模式:1.表共享读锁(Table Read Lock)2.表共享写锁(Table Write Lock)
结论:
1、对 MyLSAM 表的读操作(加读锁),不会阻塞其他线程对同一表的读请求,但会阻塞对同一表的写请求,只有当读锁释放后,才会执行其他进程的写操作。
2、对 MyLSAM 表的读操作(加读锁),会阻塞其他线程对同一表的读和写操作,只有当写锁释放后,才会执行其他进程的读写操作。
简而言之,就是读锁会阻塞写,但是不会阻塞读,而写锁会把杜希俄都阻塞。
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/6bdf7855876dc04968ebdfcce】。文章转载请联系作者。
评论