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