在工作中碰到了高并发的场景,数据量很大,后台是供应链系统,对应的表是库存记录表,每一次仓库或者门店单据状态的变化都会产生大量的数据,并且可能有多个端对同一单据进行操作的情况,故在数据库访问层使用了锁配置。
这里主要讲用到的关系型数据库层面的锁机制,将对两种所分别介绍:
乐观锁,就是字面的意思,态度很乐观,觉得不会发生同一条数据多人访问或修改的情况,但是在访问的时候会先获取最新的数据,使用版本号等机制去实现。相较于悲观锁来说,乐观锁安全性并没有做到绝对,但相对的可以提高效率。乐观锁的实现方法为例如存储的是当前的总数,那就可以再update的set中写为totalCount=totalCount+#totalCount#,而不是在后台计算完把数据拿回来直接用。当然也可以通过版本号条件来实现。
悲观锁,对系统持悲观态度,认为肯定会发生并发时间,自己访问数据的时候别人肯定也会修改,所以会在操作之前对表进行锁定,直到操作完成。一般使用的是行锁、表锁等,如果同时锁定多条数据,需要同时锁定复数条,否则多线程的情况下会造成死锁。悲观锁的实现方式为update之前的select后添加for update就可以。
数据库层面的锁好处在于即使多系统使用同一个库,也能利用数据库的排他性保证数据的安全。
作者 : emsui
出处:https://my.oschina.net/wyd524/blog/1841884
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。