举例:我现在需要调用别人提供的方法A,B,C,D这四个方法中都有各自的数据库操作。我需要在自己定义的方法中逐个调用这四个方法,当出现异常或校验失败时如何实现类似数据库中事务的回滚操作?
//添加下面引用
using System.Transactions;
TransactionOptions transactionOptions = new TransactionOptions();
transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
{
//操作四个步骤的代码, 步骤里面, 如果有异常抛出异常, 检验失败也抛出异常
//下面是提交事务
scope.Complete();
}
这个是可以的
C#中处理数据库事务的类SqlTransaction,可以百度一下学习一波
SqlTransaction不太适用这个问题,应用的场景不对。
把他的方法给改了。
不能改别人方法的情况下
如果四个数据操作都是同一个数据库,那就进行事务传递。
如果不是,那就采用所有事务都提交成功才算成功。否则事务全部回滚。
暂时没看到关于C#事务传递方面的博客,但看你描述理论上是可以的
分布式事务,有很多不同的解决办法,我以前用kafka+本地事务表解决,只能解决最终一致性,不能解决强一致性
引入kafka感觉有点重了
@DerrickYang: 建立百度下分布式事务吧,既然都成微服务了,分布式事务,分布式锁是必须解决的,相较于其他方案,kafka是最轻量级的了。我自己也写过一篇关于kafka+本地事务表的,如果有需要,可以看下
@超人小冰: 好的,我了解一下
我找了下资料发现transactionScope可以满足我的需求,详细信息大家可以百度一下。感谢大家的回答
如果你想回滚,必须得让提供你方法的人提供回滚方法才行。你可以写一个接口,让他们实现,如
interface RollbackAble
{
void Fuck();
void RollBack();
}
事务做好了是非常复杂的,建议你们商量商量,用一个成熟的方案比较好。
能协调当然是最好的,谢谢了。用transactionscope可以实现类似需求