欢迎来到银盒子的世界~
记录一下这个小的设计技巧,估计好多人都知道的,也都是这么设计的,但还是列出来仅供自己记录和参考吧。
假如有个功能,前端就一个按钮的事,但后端需要进行十多个表同步更新,其中这些表中,还涉及到好多状态的同步,什么中间表,各种关联状态,并且这些表之间要求强事务性,也就是结果必须同时失败或者同时成功,不能有半拉成功,半拉失败。
这个时候,假如只单单写一个事物,其实很多情况下是不满足要求的。因为其中必定有一些表需要先提交一次,后边的别的表才能进行数据的保存,但是只要你一提交,事物就结束了,假如在事物结束后边的逻辑里,出现了什么错误,导致保存出错,就很麻烦了,因为都没法回滚了。
这种时候可以稍微分析一下这些有关联的表,最主要的中间表,是哪个。也就是哪个表牵扯到的最多,或者它最重要,就可以优先选择这个。给这个表加一个字段,设置一个中间状态。等这个中间表提交了,事物结束了,后边的别的表也保存成功了,就把上边那个中间状态,更新一下,代表整个的流程都执行成功了。然后别的地方读取数据的时候,where条件过滤掉处于中间状态的数据。
这样读写配合起来,就能实现,事物不能回滚的后半拉,虽然数据落库了,但是查询会直接过滤掉。
这个设计思路,要求你得对整个业务比较熟悉,能分析出来哪个表重要。