目录
事务冲突的问题
比如有一个人的购物账号有三个人曾经都登陆过,这三个人如果同时的去购物网站进行购物就会出现问题。比如账号额度为10000元,此时如果一个人想要买一个8000元的商品,一个人想要买一个5000元的商品,最后一个人想买一个1000元的商品。而账号总额为10000,那么最后的结果可能会出现问题,导致最后账户余额为负数。
悲观锁
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
从上面的介绍我们可以知道,这种操作方式会导致执行效率的低下,每次都是顺序执行不允许别人做任何的操作,即使是查询一下额度不进行消费也是无法做到的。
乐观锁
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis就是利用这种check-and-set机制实现事务的。