项目背景:生产上有两个相互依赖的事务处理逻辑A和B,它们是同一个业务号在不同的作业流程中的数据处理过程。要求B已存在的时候,事务A生成的数据金额必须为0;事务B生成的时候,会查询A数据,并将数据金额改为0。
需求背景:生产数据出现了同一个业务号事务A事务B生成的数据都不为0的数据问题。这个生产问题领导交给了开发刘某某。
毕竟,名校出身的刘某某的,领导还是很信任的。领导跟老刘说,这个就是分布式事务的问题,你在这两个事务前面加个分布式锁就可以了。
刘某某看了半天生产的问题数据,哎,让他给瞧明白了。事务A和事务B都未提交的情况下,A查不到B,就没有把金额变成0;B也查不到A,也就没有把A的金额变成0。简单简单。
老刘开始写代码了。事务A中,在查询数据B的时候,先在redis里查询是否有业务号+事务B的缓存数据,有就报错。没有的话,就往redis里写入业务号+事务A的缓存数据,后面逻辑不变,处理完成后删除业务号+事务A的缓存数据。事务B中,在查询数据A的时候,先在redis里查询是否有业务号+事务A的缓存数据,有就报错。没有的话,就往redis里写入业务号+事务B的缓存数据,后面逻辑不变,处理完成后删除业务号+事务B的缓存数据。写完收工,信誓旦旦不会出问题的。读者觉得他这么写会不会出问题呢?
领导让我替他审一下老刘的代码,看的我头皮发麻。随意空行,写一行空三行,再写两行空四行。先不说代码逻辑,这代码风格让人抓狂。
我看了他的代码,艾玛,这哪是分布式锁呀,跟以前一样会算错呀。事务A事务B都在对方查询redis缓存之后写入缓存,跟以前有什么区别。我说,你还是老老实实在两个任务A任务B安排的时候就getset业务号的缓存数据,谁先来谁继续,后来的直接不用安排任务了。