首页 新闻 会员 周边

c# 如何实现代码级别的事务操作

0
悬赏园豆:100 [已解决问题] 解决于 2019-12-11 16:09

举例:我现在需要调用别人提供的方法A,B,C,D这四个方法中都有各自的数据库操作。我需要在自己定义的方法中逐个调用这四个方法,当出现异常或校验失败时如何实现类似数据库中事务的回滚操作?

DerrickYang的主页 DerrickYang | 初学一级 | 园豆:156
提问于:2019-12-10 10:46
< >
分享
最佳答案
0

//添加下面引用
using System.Transactions;

TransactionOptions transactionOptions = new TransactionOptions();
transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
{
//操作四个步骤的代码, 步骤里面, 如果有异常抛出异常, 检验失败也抛出异常

//下面是提交事务
scope.Complete();

}

收获园豆:100
风浪 | 老鸟四级 |园豆:2996 | 2019-12-11 11:48

这个是可以的

DerrickYang | 园豆:156 (初学一级) | 2019-12-11 16:09
其他回答(6)
0

C#中处理数据库事务的类SqlTransaction,可以百度一下学习一波

华临天下 | 园豆:1501 (小虾三级) | 2019-12-10 10:55

SqlTransaction不太适用这个问题,应用的场景不对。

支持(0) 反对(0) DerrickYang | 园豆:156 (初学一级) | 2019-12-10 11:11
0

把他的方法给改了。

slowstart | 园豆:525 (小虾三级) | 2019-12-10 11:40

不能改别人方法的情况下

支持(0) 反对(0) DerrickYang | 园豆:156 (初学一级) | 2019-12-10 14:04
0

如果四个数据操作都是同一个数据库,那就进行事务传递。
如果不是,那就采用所有事务都提交成功才算成功。否则事务全部回滚。

通信的搞程序 | 园豆:1747 (小虾三级) | 2019-12-10 13:10

暂时没看到关于C#事务传递方面的博客,但看你描述理论上是可以的

支持(0) 反对(0) DerrickYang | 园豆:156 (初学一级) | 2019-12-10 14:08
0

分布式事务,有很多不同的解决办法,我以前用kafka+本地事务表解决,只能解决最终一致性,不能解决强一致性

超人小冰 | 园豆:237 (菜鸟二级) | 2019-12-10 13:38

引入kafka感觉有点重了

支持(0) 反对(0) DerrickYang | 园豆:156 (初学一级) | 2019-12-10 14:09

@DerrickYang: 建立百度下分布式事务吧,既然都成微服务了,分布式事务,分布式锁是必须解决的,相较于其他方案,kafka是最轻量级的了。我自己也写过一篇关于kafka+本地事务表的,如果有需要,可以看下

支持(0) 反对(0) 超人小冰 | 园豆:237 (菜鸟二级) | 2019-12-10 15:37

@超人小冰: 好的,我了解一下

支持(0) 反对(0) DerrickYang | 园豆:156 (初学一级) | 2019-12-11 16:07
1

我找了下资料发现transactionScope可以满足我的需求,详细信息大家可以百度一下。感谢大家的回答

DerrickYang | 园豆:156 (初学一级) | 2019-12-10 14:11
0

如果你想回滚,必须得让提供你方法的人提供回滚方法才行。你可以写一个接口,让他们实现,如

interface RollbackAble
{
   void Fuck();
   void RollBack();
}

事务做好了是非常复杂的,建议你们商量商量,用一个成熟的方案比较好。

会长 | 园豆:12401 (专家六级) | 2019-12-10 17:25

能协调当然是最好的,谢谢了。用transactionscope可以实现类似需求

支持(0) 反对(0) DerrickYang | 园豆:156 (初学一级) | 2019-12-11 16:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册