背景
数据库死锁常发生于两个事务,互相依赖对方的资源,在获取锁的时候形成互相等待。MySQL会自动检测死锁,并回滚较小的事务。
例子
在用户查询积分的时候,触发了过期。
积分过期处理步骤如下:
- 查询需要过期的积分总值
- 更新用户的可用积分
- 查询需要过期的积分
- 删除对应的积分
ABA的步骤形成了不同顺序的锁访问,而这个触发点又埋在查询接口,很容易出现同时多个请求同一个用户的查询。
处理方案
破坏掉这个不同顺序,查询过期积分同时查出id,这样就不会后续再查询一遍导致等待。
数据库死锁常发生于两个事务,互相依赖对方的资源,在获取锁的时候形成互相等待。MySQL会自动检测死锁,并回滚较小的事务。
在用户查询积分的时候,触发了过期。
积分过期处理步骤如下:
ABA的步骤形成了不同顺序的锁访问,而这个触发点又埋在查询接口,很容易出现同时多个请求同一个用户的查询。
破坏掉这个不同顺序,查询过期积分同时查出id,这样就不会后续再查询一遍导致等待。