更新: 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

Asp.net core 学习笔记 ( ef core transaction scope & change level )的更多相关文章

  1. Asp.net core 学习笔记 ( ef core )

    更新 : 2018-11-26 这里记入一下关于 foreignKey cascade action 默认情况下如果我们使用 data annotation required + foreginkey ...

  2. Asp.net core 学习笔记 ef core Surrogate Key, Natural Key, Alternate Keys

    更新: 2019-12-23 foreignkey 并不一样要配上 alternate key,其实只要是 unique 就可以了. 和 sql server 是一样的, 经常有一种错觉 primar ...

  3. Asp.Net Core学习笔记:入门篇

    Asp.Net Core 学习 基于.Net Core 2.2版本的学习笔记. 常识 像Django那样自动检查代码更新,自动重载服务器(太方便了) dotnet watch run 托管设置 设置项 ...

  4. .NET CORE学习笔记系列(2)——依赖注入[6]: .NET Core DI框架[编程体验]

    原文https://www.cnblogs.com/artech/p/net-core-di-06.html 毫不夸张地说,整个ASP.NET Core框架是建立在一个依赖注入框架之上的,它在应用启动 ...

  5. .NET CORE学习笔记系列(2)——依赖注入【3】依赖注入模式

    原文:https://www.cnblogs.com/artech/p/net-core-di-03.html IoC主要体现了这样一种设计思想:通过将一组通用流程的控制权从应用转移到框架中以实现对流 ...

  6. .NET CORE学习笔记系列(2)——依赖注入【1】控制反转IOC

    原文:https://www.cnblogs.com/artech/p/net-core-di-01.html 一.流程控制的反转 IoC的全名Inverse of Control,翻译成中文就是“控 ...

  7. .NET CORE学习笔记系列(2)——依赖注入[7]: .NET Core DI框架[服务注册]

    原文https://www.cnblogs.com/artech/p/net-core-di-07.html 包含服务注册信息的IServiceCollection对象最终被用来创建作为DI容器的IS ...

  8. .NET CORE学习笔记系列(2)——依赖注入[5]: 创建一个简易版的DI框架[下篇]

    为了让读者朋友们能够对.NET Core DI框架的实现原理具有一个深刻而认识,我们采用与之类似的设计构架了一个名为Cat的DI框架.在上篇中我们介绍了Cat的基本编程模式,接下来我们就来聊聊Cat的 ...

  9. .NET CORE学习笔记系列(2)——依赖注入[4]: 创建一个简易版的DI框架[上篇]

    原文https://www.cnblogs.com/artech/p/net-core-di-04.html 本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章从 ...

随机推荐

  1. Vue源码分析(一) : new Vue() 做了什么

    Vue源码分析(一) : new Vue() 做了什么 author: @TiffanysBear 在了解new Vue做了什么之前,我们先对Vue源码做一些基础的了解,如果你已经对基础的源码目录设计 ...

  2. 【Python 脚本报错】AttributeError: 'module 'yyy' has no attribute 'xxx'的解决方法

    先参考这篇记录大概理解了原因, 再深入了解下python的import机制, 发现自己的模块之间存在互相import. 比如,A.py中import B,而B.py中也import A了, 现在执行模 ...

  3. DOM 事件有哪些阶段?谈谈对事件代理的理解

    分为三大阶段:捕获阶段--目标阶段--冒泡阶段 事件代理简单说就是:事件不直接绑定到某元素上,而是绑定到该元素的父元素上,进行触发事件操作时(例如'click'),再通过条件判断,执行事件触发后的语句 ...

  4. Hive SQL NVL 相关函数

    1.NVL函数 NVL函数的格式如下:NVL(expr1,expr2)含义是:如果oracle第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第一个参数本来的值. NVL(exp ...

  5. MySQL查询获取行号rownum

    MySQL中可以使用变量产生行号,下面是2个简单例子: 使用工具:MySQL Workbench 说明:表heyf_10中字段,empid(员工工号).deptid(部门编号).salary(薪资): ...

  6. LoadRunner11下载、安装与破解

    目前LoadRunner最新版本已经更新到LR12了,但是只有试用版本,最多只支持50人的并发,所以我们还是只能用LR11的破解版,毕竟商用 版是真的很贵,一般企业怕是都不会去购买. 1.LoadRu ...

  7. JavaScript的深拷贝

    javaScript的拷贝有浅拷贝和深拷贝.拷贝我们一般拷贝对象,获取对象的内容(字段.函数)都给复制一遍 浅拷贝:一般只是简单的赋值 //浅拷贝 var obj1={name:"cat&q ...

  8. 浅析angular,react,vue.js jQuery-1

    作者:尚春链接:https://www.zhihu.com/question/38989845/answer/79201080来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...

  9. c# 扫描局域网IP列表的几种方法

    很多软件都有获知局域网在线计算机IP的功能,但是在.net怎么实现呢,有好多方法, 下面我给大家介绍几种,供大家参考. 1.微软社区上介绍了使用Active Directory 来遍历局域网 利用Di ...

  10. java springmvc 前端 跨域问题

    有个朋友在写扇贝插件的时候遇到了跨域问题.于是我对解决跨域问题的方式进行了一番探讨. 问题 API:查询单词URL: https://api.shanbay.com/bdc/search/?word= ...