# 概念 ## 事务         一件事情,不管多少步骤,要么做完,要么不做,不允许出现中间状态 > 例如: > > 小明给小方银行转账。步骤如下: > 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、将常见问题模式化