乐观锁 和 悲观锁 的用法和区别

随着并发量的增加影响到我们数据时, 我们可以用MySQL的锁技术

悲观锁

在执行数据库操作的时候,会加一把锁, 事物提交后释放锁 (期间如果有别的线程进行数据库操作, 会阻塞, 如果一直占用资源不释放,其他线程就一直无法操作数据)

需配合MySQL的事物进行操作

使用方法

在数据库操作语句中加入for update 
如: select * from goods where id=1 for update

乐观锁

不会加锁, 但是更新的时候会进行判断, 判断跟原始的数据一不一样,返回受影响行数, 如果不一样,他会返回受影响的行数为0, 如果一样,会返回受影响的具体数量, 我们可以通过返回值,来采取对应的措施,比如回滚还是从新执行一遍

原理: 将 select 和 update 融为 一条语句, 并返回受影响的行数, 如果行数为0,说明别人已经把数据改了, 这个时候我们可以再尝试重新获取一下数据

使用方法(拿Django来说)

将 select 和 update 融为 一条语句 
GoodsSKU.objects.filter(id=sku_id,stock=orgin_stock).update(stock=new_stock, sales=new_sales)

总结

冲突比较少的时候, 使用乐观锁(没有悲观锁那样耗时的开销)
冲突比较多的时候, 使用悲观锁(没有乐观锁那么多次的尝试)

发布了128 篇原创文章 · 获赞 17 · 访问量 7188

猜你喜欢

转载自blog.csdn.net/weixin_42554191/article/details/103890547