最近碰到mysql覆盖写的低概率问题

     最近碰到一个低概率问题:

     10

     加40

     加60

     预期结果是110, 但最终实际结果是50

    

    单机单进程场景,来看下:


func proc() {
	
	amount := queryAmountFromDb()

	begin lock
	   begin transaction
	       amount += req.OrderAmount
	       setToDb(amount)
	   end transaction
	end lock

}

      平常没问题,但是,当两个请求并发而来时, 就有问题了------典型的覆盖写问题。 改成如下即可:


func proc() {
	
	begin lock
	   begin transaction
	   	   amount := queryAmountFromDb()
	       amount += req.OrderAmount
	       setToDb(amount)
	   end transaction
	end lock

}

      搞定, 不多说。

 

     补充: 后来又遇到过一次100-40-60=40的问题, 哈哈。

 

 

 

发布了2203 篇原创文章 · 获赞 4516 · 访问量 1961万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术工厂 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览