悲观锁和乐观锁的区别?

32 阅读2分钟

应用场景

悲观锁

主要是强一致性要求

比如金融,银行,支付,钱的方面

基本上都是悲观锁

乐观锁

主要是性能要求超过强一致性要求

比如电商商品的库存

还有电商商品的商品信息

说白了,就是读多写少

比如电商商品,大部分人只看不买,就像逛街一样,这个时候,大部分人只读商品信息

库存也一样,看多买少


另外,社交网站内容,比如微博

社区网站内容,比如技术社区的文章啥的

都是读多写少

所以比较适合乐观锁


说白了,就是极端情况下,哪怕个别数据异常,也不至于亏钱,就这么简单,这个技术都是应用场景决定的

实现

悲观锁

数据库:基于select for update

Java代码:基于Redis分布式


两种不同的解决方案,要解决的问题是一样的

思想也是有的

只不过是基于不同的技术方案去解决而已

说白了,就是基于Redis分布式锁,优点是性能比关系数据库更高一点,缺点是引入了新的中间件

乐观锁

数据库:基于版本号字段

Java代码:基于CAS


也是一样,要解决的问题是一样的

只不过是不同的技术方案

乐观锁,能100%确保数据强一致性吗?

能是能

但是和悲观锁,还有一个很大的实际应用的区别

就是乐观锁,只确保单个更新操作的100%,多个更新操作,就确保不了

只能使用悲观锁

工作实战

所以,即便乐观锁,能解决单个更新操作的线程安全问题

但是,在项目当中,一般都是用悲观锁

因为强一致性肯定大于高性能,特别是金融应用场景

另外,大部分系统,也没有那么高的性能要求

而且,即便是有,也是单笔数据库数据的加锁,而不是锁整个表

说白了就是,即便是有很高的交易量,比如支付系统,那是整个系统的交易量很大,但是呢,单笔订单的并发量其实是很小的

所以这个时候,用悲观锁就够了,没有必要用乐观锁,而且支付系统都会包含多个更新操作,乐观锁也不满足要求