php中的乐观锁和悲观锁

数据的锁定分为两种,第一种叫作悲观锁,第二种叫作乐观锁。

1.悲观锁,就是对数据的冲突采取一种悲观的态度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住。【数据锁定:数据将暂时不会得到修改】
2.乐观锁,认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让用户返回错误的信息。让用户决定如何去做。

以下是实例
什么是悲观锁?意思就是比较悲观,相信其他人在自己的操作过程会修改数据,影响自己的操作,
所以查询的时候就加锁,然后自己更新数据完毕再释放锁。可以有效防止减库存冲突问题。
什么是乐观锁?意思就是比较积极乐观,相信自己操作的过程中,不会有其他的人来修改数据,所以查询时就不加锁,然后更新的时候判断一下数据是不是被改掉。
以下思路是在php+mysql程序中
悲观锁的业务流程(以商品表和SKU表减库存并进行其它操作为类):

事务开始

  1. 查询商品表、锁定表:for update
  2. 判断商品库存是否大于购买数据,
  3. 如果库存满足,减少商品表库存。(不满足就回滚事务了。)
  4. 减少商品SKU表库存
  5. 记录订单操作记录等

事务提交(事务提交时即释放锁)。

可见上面的流程中整个被锁的周期是比较长的。如果改为乐观锁呢:

事务开始

  1. 查询商品表
  2. 判断商品库存是否大于购买数据,
  3. 如果库存满足,减少商品表库存(条件是商品表的库存=1中查询出的库存)
  4. 减少商品SKU表库存(同样需要判断条件)
  5. 记录订单操作记录等

事务提交(事务提交时即释放锁)。

在上面的乐观锁的执行流程中,如果3、4、5这三步中的任何一步发生异常,都会因滚事务。这样就不会出现减库存冲突导致库存脏数据了。
两种锁各有各的好,建议电商网站起步时访问量不大,不会造成压力时使用悲观锁。因为这时没有什么高并发,但也要好好检查代码防止出现死锁。
对于成熟的电商网站,必须面对高并发的情况下,应该使用乐观锁。

发布了105 篇原创文章 · 获赞 0 · 访问量 693

猜你喜欢

转载自blog.csdn.net/binxi9894/article/details/105353400
今日推荐