一、TransactionScope 环境事务

    static async Task TransactionScopeAsync()
{
using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
Transaction.Current.TransactionCompleted += OnTransactionCompleted; Utilities.DisplayTransactionInformation("Ambient TX created",
Transaction.Current.TransactionInformation); var s1 = new Student
{
FirstName = "Angela",
LastName = "Nagel",
Company = "Kantine M101"
};
var db = new StudentData();
await db.AddStudentAsync(s1); if (!Utilities.AbortTx())
scope.Complete();
else
Console.WriteLine("transaction will be aborted"); } // scope.Dispose() }

二、嵌套事务

  static void NestedScopes()
{
using (var scope = new TransactionScope())
{
Transaction.Current.TransactionCompleted += OnTransactionCompleted; Utilities.DisplayTransactionInformation("Ambient TX created",
Transaction.Current.TransactionInformation); using (var scope2 =
new TransactionScope(TransactionScopeOption.RequiresNew))
{
Transaction.Current.TransactionCompleted += OnTransactionCompleted; Utilities.DisplayTransactionInformation(
"Inner Transaction Scope",
Transaction.Current.TransactionInformation); scope2.Complete();
}
scope.Complete();
} }

事务完成代码

   static void OnTransactionCompleted(object sender, TransactionEventArgs e)
{
Utilities.DisplayTransactionInformation("TX completed",
e.Transaction.TransactionInformation);
}

你可能不知道这一点,在 .NET Framework 4.5.0  版本中包含有一个关于 System.Transactions.TransactionScope 在与 async/await 一起工作时会产生的一个严重的 bug 。由于这个错误,TransactionScope 不能在异步代码中正常操作,它可能更改事务的线程上下文,导致在处理事务作用域时抛出异常。

这是一个很大的问题,因为它使得涉及事务的异步代码极易出错。

好消息是,在 .NET Framework 4.5.1 版本中,微软发布了这个 "异步连接" 错误的修复程序。作为开发者的我们需要明确的做到以下两点:

  • 如果说你在 TransactionScope 代码中使用 async/await,你需要将框架升级到 .NET 4.5.1 或以上版本。
  • 在有包装异步代码的 TransactionScope 的构造函数中指定 TransactionScopeAsyncFlowOption.Enabled .

TransactionScopeAsyncFlowOption

在 .NET 4.5.1中,TransactionScope 有一个名为 TransactionScopeAsyncFlowOption 的新枚举,可以在构造函数中提供。 您必须通过指定,明确地选择跨线程连续的事务流,如下:

 using (var tx = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
await SomeMethodInTheCallStackAsync()
.ConfigureAwait(false); tx.Complete();
}

你可能很好奇,默认的 TransactionScopeAsyncFlowOption 是 Suppress(阻止的),因为微软想避免破坏 .NET 4.5.0 版本中代码库中行为。

最后

使用 TransactionScope 结合 async / await 时,你应该更新所有使用 TransactionScope 的代码路径以启用 TransactionScopeAsyncFlowOption.Enabled 。 这样才能使事务能够正确地流入异步代码,防止在TransactionScope下使用时业务逻辑不正常。

最新文章

  1. 关于项目中值对象Identifier的设计-领域驱动
  2. Python之路-python(装饰器、生成器、迭代器、Json & pickle 数据序列化、软件目录结构规范)
  3. 使用vs2013打开vs2015项目
  4. SQL : 在SQL Server 2008(Or Express)中如何Open并编辑数据表【转】
  5. cpack
  6. ASIHTTPRequest详解
  7. Android(java)学习笔记196:Android中Menu的使用(静态和动态)
  8. apache:添加cgi模式
  9. takes 3 positional arguments but 4 were given错误
  10. 格式化 输出 while ,else ASCII码 ,字节转换 ,逻辑运算
  11. KVM之七:KVM克隆
  12. JavaScript手工编写滚动条组件
  13. scala的input
  14. Ackerman
  15. winedt102安装
  16. 欢迎来到Python世界
  17. openXML向Word插入表
  18. 启动matlab时总是直接跳转到安装界面的解决方案
  19. MSSQL SQL Server代理 作业 设置(调用存储过程)
  20. c#day04从控制台获取一个字符

热门文章

  1. 【青橙商城-管理后台开发】3. web模块搭建
  2. Python非递归实现二叉树的后续遍历
  3. 【转载】Jave开发手册之正则表达式预编译
  4. pt-online-schema-change使用
  5. Codeforces 1097D. Makoto and a Blackboard
  6. luogu P4762 [CERC2014]Virus synthesis (回文自动机)
  7. MyBatis 源码篇-SQL 执行的流程
  8. 如何给Swagger加注释
  9. vsCode设置代码片段
  10. OpenCl入门——实现简单卷积