多个事务同时更新一行数据,都会加锁,然后排队等待,必须一个事务执行完毕提交了,释放锁,才能唤醒下一个事务继续执行。那这多个事务运行时,加的啥锁?
创新互联是一家集网站建设,灵石企业网站建设,灵石品牌网站建设,网站定制,灵石网站建设报价,网络营销,网络优化,灵石网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
是X锁,Exclude独占锁,当有一个事务加了独占锁,此时其他事务再想更新这行数据,都要加独占锁,但只能暂时生成独占锁并在后面等待。
当有人在更新数据时,其他事务可以读取这行数据吗?需要加锁吗?
不用,因为默认情况下,有人在更新数据时,然后你要去读取,直接默认就是开启MVCC。即此时对一行数据的读、写两个操作默认不会加锁互斥,因为MySQL的MVCC就是为此设计,避免频繁加锁互斥。
此时你读取数据,完全可以根据你的ReadView,去undo log版本链条里找个你能读的版本,而完全不用顾虑别人是否在更新。
就算你真的等他更新完毕并提交了,基于MVCC,你也读不到他更新的值!因为ReadView机制不允许,所以你默认情况下的读,完全无需加锁,不需要去关心其他事务的更新加锁问题,直接基于MVCC读某个快照即可。
万一要是你在执行查询操作时,偏想加锁呢?
也可以满足你,MySQL支持共享锁,S锁,语法如下:
select * from table lock in share mode
在查询语句后面加上lock in share mode,意思就是查询的时候对一行数据加共享锁。若此时有别的事务在更新这行数据,已经加了独占锁,此时你的共享锁还能加吗?
当然不行了,此时锁互斥,他只能等待。
可以的,你们俩都可加共享锁,共享锁和共享锁不互斥。
所以更新数据时,必然加独占锁,独占锁和独占锁互斥,此时别人不能更新; 但若此时你要查询,默认不加锁,走MVCC读快照版本,但你查询是可以手动加共享锁的,共享锁和独占锁互斥,共享锁和共享锁不互斥。
一般开发业务系统的时候,其实你查询主动加共享锁很少见,数据库行锁虽然实用, 但一般不会在数据库层面做复杂的手动加锁,反而会用基于redis/zookeeper的分布式锁来控制业务系统的锁逻辑。
查询操作还能加互斥锁:
select * from table for update
我查出来数据以后还要更新,此时我加独占锁了,其他闲杂人等,都不要更新这数据了!
一旦你查询时加独占锁,在你事务提交前,任何人都不能更新数据,只能你在本事务里更新数据,等你提交了,别人才能再更新数据。
本文描述了默认情况下更新数据的独占锁,默认情况下查询数据的mvcc机制读快照,然后通过查询加共享锁和独占锁的方式,共享锁和独占锁之间的互斥规则。
当前标题:聊一聊MySQL的共享锁和独占锁
分享网址:http://www.shufengxianlan.com/qtweb/news19/69219.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联