情境:程式里面的实作,是先呼叫 domain 去资料库新增资料,紧接着再马上做查询动作,但却查不到刚才所新增的资料。
可能原因一
程式里面有使用 TransactionScope,如果对像 db 是二个以上,那处理层级就会被提高,会由 MSDTC 来介入处理。但如果都是同一个 db 时,MSDTC 不会被 trigger,而是由 db server 自己处理 transaction。经临床实验证明,如果有使用 TransactionScope,程式里面即使已呼叫 transaction.commit,这也不代表资料会马上落地到资料库。这个原因是因为 MSTDC or DB Server 有它自己处理「交易」时要做的事,所以程式就算已经 commit(呼叫方已经收到 return),这时后马上去查询刚才所新增的资料也不一定会马上有。
可能原因二
资料库有实作读写分离。资料落地后要同步到 standby 也是需要时间,不管做得再快(就算只有毫秒差),都会需要一点时间。所以这时后程式一呼叫完写入的方法,并且就马上进 standby db 查的话,就有可能查询不到。
可能解法一
如果在程式的设计上没有到非常讲究,可以在呼叫新增资料的方法(或着是 procedure)内,再多回传所需要的资料。但为什么会说「讲究」这个字,是因为有些设计的模式,并不建议在新增的动作中,又再回传资料。例:CQRS。
可能解法二
如果呼叫方在呼叫完后没有得到错误,并且在商业逻辑的部份也预期这就算是顺利新增完资料的话,可以再多实做「重试」的机制。