c# – 为什么 – 如何处理后处理交易?
发布时间:2020-12-15 03:57:38 所属栏目:百科 来源:网络整理
导读:我正在尝试使用一些环境事务范围(谢谢,entity-framework),我以前没有做过,我看到一些我想要理解的奇怪的行为. 我试图加入当前的事务范围,并在成功完成后做一些工作.我的招募参与者由于其拥有的一些资源而实施了IDisposable.我有一个简单的例子,表现出奇怪的
我正在尝试使用一些环境事务范围(谢谢,entity-framework),我以前没有做过,我看到一些我想要理解的奇怪的行为.
我试图加入当前的事务范围,并在成功完成后做一些工作.我的招募参与者由于其拥有的一些资源而实施了IDisposable.我有一个简单的例子,表现出奇怪的行为. 对于这个班, class WtfTransactionScope : IDisposable,IEnlistmentNotification { public WtfTransactionScope() { if(Transaction.Current == null) return; Transaction.Current.EnlistVolatile(this,EnlistmentOptions.None); } void IEnlistmentNotification.Commit(Enlistment enlistment) { enlistment.Done(); Console.WriteLine("Committed"); } void IEnlistmentNotification.InDoubt(Enlistment enlistment) { enlistment.Done(); Console.WriteLine("InDoubt"); } void IEnlistmentNotification.Prepare( PreparingEnlistment preparingEnlistment) { Console.WriteLine("Prepare called"); preparingEnlistment.Prepared(); Console.WriteLine("Prepare completed"); } void IEnlistmentNotification.Rollback(Enlistment enlistment) { enlistment.Done(); Console.WriteLine("Rolled back"); } public void Dispose() { Console.WriteLine("Disposed"); } } 当使用时如图所示 using(var scope = new TransactionScope()) using(new WtfTransactionScope()) { scope.Complete(); } 控制台输出显示重要性:
武汉理工大学. 在交易完成之前,我会被处理好.这种…否定了交易范围挂钩的好处.我希望一旦交易成功完成,我会被通知,否则我可以做一些工作.我不幸的是假设这将发生在scope.Complete()之后,在我离开使用范围之前被处分.这显然不是这样. 当然,我可以把它砍掉但是我有其他的问题,基本上阻止我这样做.在这种情况下,我必须舍弃和做别的事情. 我在这里做错了吗?还是这个预期的行为?可以做些不同的事情来防止这种情况发生吗? 解决方法
这是自我造成的痛苦.你违反了一个非常基本的IDisposable规则,只有当对象不再被其他任何地方使用时才被处理掉.当使用的语句调用Dispose()时,您在WtfTransactionScope构造函数中提交了对象的引用.在完成之前,您不能处理它,这意味着必须在TransactionScope的using语句完成并且事务已提交/回退之后处理它.
我会让你担心让它漂亮,但一个明显的方法是: using(var wtf = new WtfTransactionScope()) using(var scope = new TransactionScope()) { wtf.Initialize(); scope.Complete(); } 准备完成只是一个无益的调试声明.只需删除它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Ruby的Object#define_method vs Module#define_method
- 如何在iphone中找出当年是否闰年
- C# 创建EXCEL图表并保存为图片
- iphone – 核心数据 – 如何生成CoreDataGeneratedAccessor
- PostgreSQL 连接问题 FATAL: no pg_hba.conf entry for hos
- objective-c – 带#define的常量字符串数组 – objective c
- cocos2dx 3.2 自定义C++绑定Lua脚本问题
- Redux异步方案选型
- typescript编写react组件 —— 留言、评论组件
- git整理分支日常笔记