一点PHP博客分享关于在编程中最常用的几种锁机制,分别是排它锁、共享锁、悲观锁、乐观锁,本文深度详细分析解释各锁的使用场景以及实现方式和它们之间的区别。本文内容由博主自身理解以及查阅相关资料后的总结,有不对的地方请及时纠正。
1 2 3 4 5 6 7 |
set autocommit=0; BEGIN; SELECT * from bb_blog where id = 1 for update; update bb_blog set title = 5525 where id = 1; |
1 |
SELECT * from bb_blog where id = 1 for update; |
1 |
SELECT * from bb_blog where id = 1; |
1 2 3 4 5 6 7 |
set autocommit=0; BEGIN; SELECT * from bb_blog where id = 1 lock in share mode; update bb_blog set title = 5525 where id = 1; //如果不使用 |
1 |
SELECT * from bb_blog where id = 1 lock in share mode; |
1 |
SELECT * from bb_blog where id = 1 lock; |
总结:只要客户端1上了共享锁 客户端2无论是否使用 lock in share mode;都可以看到数据,但是不能操作。如果客户端1做了update操作,客户端2使用了lock in share mode;不能看到数据不能操作,直接select可以看到之前的老数据。
表示在查询数据表某一行记录时,很乐观的认为其他人不会在这个时候对这行数据进行update操作,只有在update的时候才会上锁认为别人也在操作这条数据。
乐观锁常实现方式通过version,在数据表中加一个字段version,需要操作数据的时候 先将他和其他数据一起取出,然后在update的时候where中加入version这个字段,并且修改的时候+1。如果这个字段被人改过了,就认为这条数据已经被人操作了。
表示无论在查询数据或者修改数据的时候都认为同时有人在修改数据,保证在查询的时候也只能是一个人在操作,一般是使用mysql本身的排它锁+事物的方式现实,
1 2 3 4 5 6 7 |
set autocommit=0; BEGIN; SELECT * from bb_blog where id = 1 for update; //排它锁的方式 update bb_blog set title = 5525 where id = 1; |
如果字段上有主键索引,在使用update操作该数据的时候才会触发行锁机制,其他update的操作都会被堵塞,如果没有主键索引字段则会直接进行表锁。
悲观锁基本依靠数据库排它锁或者其他锁实现/或者redis等其他,乐观锁通过代码+字段实现。
悲观锁,无论是读还是写,都要上锁 通过for update。事物没有提交之前 只能有一个人能访问该数据。
乐观锁,数据只要没有出现update的操作,大家都可以访问该数据。
使用了排它锁,就算是select读取操作同样会被堵塞。
使用了共享锁 读取操作可以进行,前提是上锁者没有进行update操作
2019年4月23日 下午3:01 沙发
总结的不错,谢谢
2019年4月23日 下午4:00 1层
@知识共享网
2019年5月14日 下午9:25 板凳
第一次听这么多的锁,总结的有意思
2019年7月19日 下午1:19 地板
这么多锁 外行确实不好区别