更新: 2020-02-21

补上一些忧虑

public async Task Inside()
{
using var scope = SqlCommonMethod.CreateTransactionScope();
await SqlCommonMethod.SetIsolationLevel(Db, IsolationLevel.Serializable); // 开启高级别锁
var countries = await Db.Countries.ToListAsync(); // counties 表被高级锁了
await SqlCommonMethod.SetIsolationLevel(Db, IsolationLevel.ReadCommitted); // 设置回普通锁, 不然接下来都会一直是高级锁
await Inside2();
scope.Complete(); // 这里的 complete 结束并不会解锁, 会一直等到最外面的 scope 被释放, 符合逻辑
} public async Task Inside2()
{
using var scope = SqlCommonMethod.CreateTransactionScope();
var countries = await Db.States.ToListAsync(); // // states 表被普通锁了
scope.Complete();
} #region Simple test
[HttpPost("simple-test")]
public async Task<IActionResult> SimpleTest()
{
using (var scope = SqlCommonMethod.CreateTransactionScope())
{
await Inside();
scope.Complete(); // 这里依然不会解锁, 要等到 scope 释放
}
// 直到 using 结束才会解锁 table 哦
return Ok("ok");
}

总结 : 每次设置级别后最好是设置回去. 不然全场都会使用高级锁.

ef core 有 unit of work 的概念,当我们 save change 时会自动使用 transaction 确保更新的一致性. 隔离级别是默认的 read committed 不允许脏读.

但是呢, 有时候我们希望拥有更好的隔离级别, 比如 repeatable read, serializable

那么就需要调用 database.beginTransaction 了.

一旦需要自己控制 trans 麻烦就跟着来了。

比如在多个服务嵌套调用时, 如何共享 trans 呢 ?

每个服务的 trans 级别也有可能是不同的.

如果我们单纯使用 beginTransaction 那么需要在每个服务写判断,是否有 current transaction 做出不同的处理.

在早期, 我们会用 transaction scope 作为业务级别的事务.

transaction scope 非常强大, 可以跨库, 分布式, 甚至可以链接 file system

比如一个事务内做了数据库修改,也创建了 file, 如果事务最终失败,连 file 也可以 rollback 删除掉.

但自从 ef 出现后, 这个就变得大材小用了些. ef 也不推荐我们使用了 refer https://docs.microsoft.com/zh-cn/ef/ef6/saving/transactions?redirectedfrom=MSDN

ef core 在 2.1 的时候支持了 transactionscope 但是不支持分布式, 好像是不兼容 linux 所以去掉了.

但是在我说的这种情况下,使用它依然会让代码变得更好.

调用起来是这样的

            using (var scope = new TransactionScope(
scopeOption: TransactionScopeOption.Required,
transactionOptions: new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.RepeatableRead },
asyncFlowOption: TransactionScopeAsyncFlowOption.Enabled
))
{
try
{ }
catch (Exception ex)
{
return BadRequest(ex.Message);
}
scope.Complete();
}

默认隔离级别是 serializable.

如果想在 service 里面嵌套, 那么重要设定 scopeOption 是 required 就可以了.

它还有另外 2 个选择, 1 个是 new 意思是另外开启一个独立的 trans, 再一个是 suppend 就是完全没有 trans 无关.

有了这些就很灵活了,在不同 service 中我们可以去实现独立或无关的事务处理.

使用过程中需要注意几件事情

嵌套 scope 需要使用同一种级别

这个挺麻烦的,通常不可能全部一个级别吧...

目前没有看到方法可以修改的,一个可能的办法是直接调用 sql 语句

set transaction isolation level read committed
set transaction isolation level repeatable read;
set transaction isolation level serializable

去设定它.

这里顺便说说 sql server 对于这一块的处理.

https://www.cnblogs.com/keatkeat/p/11830113.html

另一个要注意的是, 一定要设置 async enabled 如果 scope 内需要 async 的话

asyncFlowOption: TransactionScopeAsyncFlowOption.Enabled

refer :

https://www.cnblogs.com/csdbfans/p/transactionscope.html

https://blog.csdn.net/qin_yu_2010/article/details/86150247

https://docs.microsoft.com/en-us/ef/core/saving/transactions

https://weblogs.thinktecture.com/pawel/2018/06/entity-framework-core-use-transactionscope-with-caution.html

https://www.cnblogs.com/taiyonghai/p/6047849.html

https://www.21cto.com/article/1075

https://www.codeproject.com/Articles/690136/All-About-TransactionScope#hBusinessTrans

https://codewala.net/2018/05/06/transactionscope-a-simple-way-to-handle-transactions-in-net/

https://docs.microsoft.com/zh-cn/dotnet/framework/data/transactions/implementing-an-implicit-transaction-using-transaction-scope

最新文章

  1. Tween Animation----Rotate旋转动画
  2. Microsoft.Office.Interop.Excel的用法以及利用Microsoft.Office.Interop.Excel将web页面转成PDF
  3. 更改mysql中当前auto_increment的值的方法
  4. Tomcat中文乱码问题的原理和解决方法
  5. C++常见gcc编译链接错误解决方法
  6. 【Java学习笔记】函数使用
  7. FoxOne---一个快速高效的BS框架--WEB控件属性编辑器
  8. JQuery DataTables Editor---页面内容修改&amp;&amp;数据库信息修改 (2)
  9. 我终于解决UM编辑器了 泪......
  10. tableIView 区头的一点问题
  11. Android Static分析
  12. 用LED灯和按键来模拟工业自动化设备的运动控制
  13. SpringBoot配置
  14. linux学习:sed与awk与tr用法整理
  15. JavaScript数组去重—ES6的两种方式
  16. 如何使用bootstrap框架
  17. C/C++之static函数与普通函数
  18. 20165210 Java第六周学习总结
  19. Restore IP Addresses,将字符串转换成ip地址
  20. 深入理解JavaScript系列(38):设计模式之职责链模式

热门文章

  1. go无缓冲通道
  2. 《Glibc内存管理》笔记DAY3
  3. RK3288 st7703 mipi屏指令过长,程序跑飞
  4. How To Install P4 Tutorials
  5. webpack介绍和使用
  6. [Java复习] 设计模式 Design Pattern
  7. zblog模板怎么安装?zblog主题安装教程
  8. 阶段5 3.微服务项目【学成在线】_day18 用户授权_04-方法授权-方法授权实现
  9. 好用的开源SVN仓库
  10. confluent kafka connect remote debugging