背景

数据库死锁常发生于两个事务,互相依赖对方的资源,在获取锁的时候形成互相等待。MySQL会自动检测死锁,并回滚较小的事务。

例子

在用户查询积分的时候,触发了过期。

积分过期处理步骤如下:

  1. 查询需要过期的积分总值
  2. 更新用户的可用积分
  3. 查询需要过期的积分
  4. 删除对应的积分

ABA的步骤形成了不同顺序的锁访问,而这个触发点又埋在查询接口,很容易出现同时多个请求同一个用户的查询。

处理方案

破坏掉这个不同顺序,查询过期积分同时查出id,这样就不会后续再查询一遍导致等待。