我们有如下测试数据:
现在我们对id=1的数据行共享锁查询,这里会利用begin开缘由务,而不关闭事务,这样做是用来测试,由于提交事务或回滚事务就会开释锁。
共享锁sql剖析实例打开一个查询窗口
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
末了,欢迎大家留言补充,谈论~~~