我们有如下测试数据

现在我们对id=1的数据行共享锁查询,这里会利用begin开缘由务,而不关闭事务,这样做是用来测试,由于提交事务或回滚事务就会开释锁。

共享锁sql剖析实例

打开一个查询窗口

phpmysql共享锁mysql共享锁及排它锁 Bootstrap

BEGIN;SELECT FROM area WHERE id=1 LOCK IN SHARE MODE

查询结果如下:

此时我们没有提交事务,共享锁没有被开释。

实例1:

这时候我们新开一窗口,对id=1的数据行修正下数据试试

UPDATE area SET area_name='北京市2' WHERE id=1

运行结果如下:

一贯在运行中。

缘故原由是共享锁没有被开释

实例2:

这时我们再新开一个窗口,对id=1的数据行读取(不加锁机制)试试

可以读取数据

实例3:

这时我们再新开一个窗口,对id=1的数据行读取(加读锁机制)试试

也可以读取数据

由此得出以下结论:

1.共享锁的行不可以被修正(实例1)

2.共享锁的行可以不加任何锁读取(实例2)

3.共享锁的行可以加读锁读取(实例3)

排他

mysql InnoDB引擎默认的修正数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁

select语句默认不会加任何锁类型,

如果加排他锁可以利用select ...for update

加过排他锁的数据行在其他事务中是不能修正数据的,

也不能通过for update和lock in share mode锁的办法查询数据,

但可以直接通过select ...from...查询数据,由于普通查询没有任何锁机制

排他锁sql剖析实例

打开一个窗口,现在我们对id=1的数据行排他查询

此时我们没有提交事务,排他锁没有被开释

实例4:

新开一个窗口,对id=1的数据行排他锁办法读取试试

一贯在运行中。
缘故原由是排他锁没有被开释

实例5:

再新开一个窗口,对id=1的数据行共享锁办法读取试试

一贯在运行中。
缘故原由是排他锁没有被开释

实例6:

再新开一个窗口,对id=1的数据行进行普通查询试试

可以读取到数据

由此得出以下结论:

1.排他锁的行不可以再加排他锁(实例4)

2.排他锁的行可以不加读锁(实例5)

1,2两点简化之排他锁的行不可以再加任何锁

3.排他锁的行可以普通读取(实例6)

共享锁与排他锁小结

排他锁与共享锁不能存在同一数据上

排他锁与排他锁也不能在同一数据上

共享锁与共享锁可以在同一数据上。

不用锁的查询可以读取加锁(共享锁,排他锁)的同一行数据

php7进阶到架构师干系阅读

https://www.kancloud.cn/gofor/gofor

末了,欢迎大家留言补充,谈论~~~