错误的案例
约 368 字大约 1 分钟
2025-02-12
错误的案例
下面是一段伪代码,来呈现一个错误的例子
db1.BeginTransaction();
serviceA.BeginTransaction();
...写一些操作db1的业务代码
...调用一些serviceA的接口
serviceA.Commit();
db1.Commit();
有时候在编写业务逻辑时,可能需要调用其他服务来完成某些功能。在调用完这些服务之后,你会将数据库事务提交。
如果在服务调用过程中发生异常,数据库不会提交事务。从表面上看,整个事务似乎已经达到了一致性,没有什么问题。
但是有一个场景被忽略了,即当 serviceA 成功提交事务后,服务器突然宕机或者当前程序因为更新而被 kill 掉,导致 db1 无法成功提交事务,最终使系统数据不完整。
建议
请避免在操作数据库的过程中,调用其他服务,以确保事务强一致性。
请避免在操作数据库的过程中,调用其他服务,以确保事务强一致性。
解决方案
当您需要在操作数据库的同时访问 serviceA 来完成某些功能时,建议您将操作数据库的代码封装到 serviceB 中,再通过 RemoteClient 同时调用 serviceA 和 serviceB,以确保事务的一致性并实现您要的功能。
使用这种方法可以将相关的代码组织在一起,减少耦合性,并且可以更容易地管理事务。