mysql 共享排他锁
1、基础知识
共享锁又叫S锁(Share Locks),共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。
排他锁又叫X锁(eXclusive Locks,记为X锁),排他锁就是不能与其他锁并存,只有等待锁释放完成以后其他事务才能得到锁。
下面是共享锁与排他锁的互斥关系
S X
S 兼容 互斥
X 互斥 互斥
2、练习题
有autoid表数据如下
a、共享锁(select ...... lock in share mode;)
SessionA | SessionB |
begin; | |
select * from test.autoid WHERE id=1 lock in share mode; | begin; |
UPDATE test.autoid SET `name`="xxxx" WHERE id=1; | |
锁超时 |
(图A)
SessionA | SessionB |
begin; | begin; |
select * from test.autoid WHERE id=1 lock in share mode; | select * from test.autoid WHERE id=1 lock in share mode; |
有数据 | 有数据 |
(图B)
可以从上图(A)中看到,因为事务A对数据1加上了共享锁,并且当时事务A的锁并没有进行释放,所以事务B对数据进行更新操作的时候是不可以进行操作的。在图B当中我们可以看到,当事务A对数据进行了加锁,这个时候事务B是可以读取数据的,不需要进行阻塞。但是如果这个时候事务A对数据进行了更改,并且事务没有提交的情况下,那么这个时候事务B读取的数据会是旧数据而不是新数据。由此可以看出,共享锁是:读读可以并行;
b、排他锁(select ...... for update;)
sessionA | sessionB |
begin; | |
select * from test.autoid WHERE id=1 for update; | begin; |
select * from test.autoid WHERE id=1 for update; | |
阻塞,等待A事务执行 |
从上图可以看到,对数据加上了排他锁以后,即使事务B是对事务A进行读取操作也是无法进行了,这也正应正了刚才所说的,排他锁与其他锁是互斥的,排他锁:写写/读写必须互斥;