# 概念

## 事务

        一件事情，不管多少步骤，要么做完，要么不做，不允许出现中间状态

> 例如：
> 
> 小明给小方银行转账。步骤如下：
> 1、小明，账上扣掉1块
> 
> 2、小明流水上增加一条支出信息
> 
> 3、小方，账上增加1块
> 
> 4、小方流水上增加一条收入信息

所以，我们在实际工作中带上事务

> 1、先冻结小明那条数据（其他人不能写或者读（不包括脏读））
> 
> 2、小明账上扣掉1块（冻结行数据）
> 
> 3、流水表写入2条可回退事务插入
> 
> 4、冻结小方的那条数据（其他人不能读或者写）
> 
> 5、提交，让上面4个步骤完成，并解冻

#### 事务死锁

转账并不是一个人在转，在大量操作情况下会发生这个现象

同一时间，小明向小方转钱，同一时间小方向小明转钱

> 1、小明冻结（小明转账给小方）
> 
> 2、小方冻结（小方转账给小明）
> 
> 3、打算冻结小方，发现冻不住，等待解冻后再冻住（小明转账给小方）
> 
> 4、打算冻结小明，发现冻不住，等待解冻后再冻住（小方转账给小明）
> 
> 5、双方等到天荒地老。或者到超时

#### 暴力运维

用户会反应，出不了库，或者入不了库，或者页面卡住了

然后运维人员二话不说重启服务

> 除了这个死锁业务错误提交
> 
> 另外的正常业务也会受这次暴力重启影响

# 避免故障

#### 串行（上策）

如果解决事务死锁，项目能健康一半

> 1、业务服务端不执行代码，只是把代码发队列
> 
> 2、队列服务器消费，串行消费
> 
> 3、消费完成后结果写入redis，由业务服务端轮询拉取
> 
> 用户无感知

#### 缓存锁（中策）

> 1、每次执行前，锁住主表对应行
> 
> 2、发现锁不住时，业务终止，并提示用户等下再试
> 
> 用户偶尔被打扰
> 无法保证锁干净

#### 完全由告警系统兜底（下策）

> 1、让系统继续这样
> 
> 2、告警不停刷出问题所在
> 
> 3、将常见问题模式化
