Asp.net core 学习笔记 ( ef core transaction scope & change level )
更新: 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://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/
Asp.net core 学习笔记 ( ef core transaction scope & change level )的更多相关文章
- Asp.net core 学习笔记 ( ef core )
更新 : 2018-11-26 这里记入一下关于 foreignKey cascade action 默认情况下如果我们使用 data annotation required + foreginkey ...
- Asp.net core 学习笔记 ef core Surrogate Key, Natural Key, Alternate Keys
更新: 2019-12-23 foreignkey 并不一样要配上 alternate key,其实只要是 unique 就可以了. 和 sql server 是一样的, 经常有一种错觉 primar ...
- Asp.Net Core学习笔记:入门篇
Asp.Net Core 学习 基于.Net Core 2.2版本的学习笔记. 常识 像Django那样自动检查代码更新,自动重载服务器(太方便了) dotnet watch run 托管设置 设置项 ...
- .NET CORE学习笔记系列(2)——依赖注入[6]: .NET Core DI框架[编程体验]
原文https://www.cnblogs.com/artech/p/net-core-di-06.html 毫不夸张地说,整个ASP.NET Core框架是建立在一个依赖注入框架之上的,它在应用启动 ...
- .NET CORE学习笔记系列(2)——依赖注入【3】依赖注入模式
原文:https://www.cnblogs.com/artech/p/net-core-di-03.html IoC主要体现了这样一种设计思想:通过将一组通用流程的控制权从应用转移到框架中以实现对流 ...
- .NET CORE学习笔记系列(2)——依赖注入【1】控制反转IOC
原文:https://www.cnblogs.com/artech/p/net-core-di-01.html 一.流程控制的反转 IoC的全名Inverse of Control,翻译成中文就是“控 ...
- .NET CORE学习笔记系列(2)——依赖注入[7]: .NET Core DI框架[服务注册]
原文https://www.cnblogs.com/artech/p/net-core-di-07.html 包含服务注册信息的IServiceCollection对象最终被用来创建作为DI容器的IS ...
- .NET CORE学习笔记系列(2)——依赖注入[5]: 创建一个简易版的DI框架[下篇]
为了让读者朋友们能够对.NET Core DI框架的实现原理具有一个深刻而认识,我们采用与之类似的设计构架了一个名为Cat的DI框架.在上篇中我们介绍了Cat的基本编程模式,接下来我们就来聊聊Cat的 ...
- .NET CORE学习笔记系列(2)——依赖注入[4]: 创建一个简易版的DI框架[上篇]
原文https://www.cnblogs.com/artech/p/net-core-di-04.html 本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章从 ...
随机推荐
- SpringBoot-文件在线预览解决方案-基于OpenOffice及jacob
项目中有一个需求:实现文件(主要是Office文件)的在线预览,根据前端需求,Office文件需要转换成pdf或者html方可在浏览器中打开预览,那么后端需要将文件转为pdf/格式返回地址给前端.目前 ...
- CSS中的cursor属性
css中的cursor这个属性是用来设置光标形状的. 这个属性定义了鼠标指针放在一个元素边界范围内时所用的光标的形状. 默认值:auto 继承性:yes 出现版本:css2 JavaScript语法: ...
- linux操作利器alias用法
写在前边 学习这件事,有时候并不一定很刻意,而是从生活,从经验中去积累,不知道什么时候就发生了. type 命令 一般情况下,type命令被用于判断另外一个命令是否是内置命令,但是它实际上有更多的用法 ...
- Angular 执行 css3 简单的动画
<div class="content"> 内容区域 <button (click)="showAside()">弹出侧边栏</b ...
- 优雅编写Python3 的62个小贴士
iterable技巧 ▍1.创建一个数字序列(从0到10,间隔为2) >>> range(0,10,2)[0, 2, 4, 6, 8] ▍2.对一串数字求和(从0到10,间隔为2 ...
- 阿里云RDS与ECS服务器数据库做主从
阿里云RDS与ECS服务器数据库做主从 [精] 里云RDS(数据库)基于飞天大规模分布式计算和存储能力,提供超高性价比的单机版实例,同时利用读写分离横向扩展读能力,满足网站类的业务需求.提供稳定.高性 ...
- 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_13-用户退出-前端
调试前端的退出 logout方法 找到路由 退出对应的组件页面 这就是退出的组件 退出的方法 把这两个js的引用,从上面复制到下面引用.因为可能存在js的冲突问题. 资料里面给了一个前端 整个覆盖当前 ...
- 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_07-用户认证-认证服务查询数据库-解析申请令牌错误信息
1.2.5.4 解析申请令牌错误信息 当账号输入错误应该返回用户不存在的信息,当密码错误要返回用户名或密码错误信息,业务流程图如下: 修改申请令牌的程序解析返回的错误: 由于restTemplate收 ...
- 第十九章 动态URL权限控制——《跟我学Shiro》
目录贴:跟我学Shiro目录贴 用过Spring Security的朋友应该比较熟悉对URL进行全局的权限控制,即访问URL时进行权限匹配:如果没有权限直接跳到相应的错误页面.Shiro也支持类似的机 ...
- Demo客户端相关规范 v1.0
目录 开发环境 开发工具 代码管理 项目代码 分支管理 名称管理 打包管理 存储路径 存储结构 测试包 正式包 名称管理 依赖组件 内部组件 外部组件 解决方案结构 解决方案命名 解决方案文件夹 项目 ...