最近碰到一个低概率问题:
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的问题, 哈哈。