问题分析
突然间被运营滴滴说某个活动的报名人数超过了限制人数,问怎么回事,我一下子还挺蒙的,我明明有在报名的操作之前设置了检查如果超过报名人数代码逻辑会抛错继续报名的呀。
然后我又打开数据库看了一下,出现了以下的情况:
于是情况就很明了了,这明显就是并发控制没有做好。为了叙述清楚这个情况,下面讲述一下业务逻辑:首先是从meeting表查是否报名已满,如果未满,则开始事务,将signed字段自增1,然后把参会记录插入到meeting_member表,提交事务。这里实际上是出现了丢失更新,举例如下。
T1
T2
数据库中signed的值
BEGIN;
0
SELECT signed FROM meeting WHERE meeting_id=xx; (读出来的值为0)
BEGIN;
UPDATE meeting SET signed=signed+1 WHERE meeting_id=xx;
SELECT signed FROM meeting