1.我们为mylock表加read锁(读阻塞写例子)
session_1 | session_2 |
---|---|
获得表mylock的READ锁定![]() | 连接终端 |
当前session可以查询该表记录 ![]() | 其他session也可以查询该表的记录![]() |
当前session不能修改锁定的表![]() | 其他session插入或者更新锁定表会一直等待获得锁: ![]() |
当前session不能查其他表(其他表不管有没有加锁)![]() | 其他session可以查询或者更新未锁定的表 ![]() |
2.加写锁
session_1 | session_2 |
---|---|
获得表mylock的WRITE锁定![]() | |
当前session对锁定表的查询+更新+插入操作都可以执行:![]() ![]() ![]() | 其他session对锁定表的查询被阻塞,需要等待锁被释放:![]() |
当前session不能查询其他表 ![]() |
MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。
MySQL的表级锁有两种模式:
表共享读锁(Table Read Lock)
表独占写锁(Table Write Lock)
锁类型 他人可读 他人可写
读锁 是 否
写锁 否 否
结论:
结合上表,所以对MyISAM表进行操作,会有以下情况:
1、对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
2、对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。
简而言之,就是读锁会阻塞写,但是不会堵塞读。而写锁则会把读和写都堵塞