Abp之工作单元与事务
环境:Abp1.2
疑问:没有调用工作单元的SaveChanges方法引起的事务提交时机的问题.
例如:有一个应用服务代码如下:
public void CreatePhrase(PhraseCreateDto input)
{var phrase = Mapper.Map<Phrase>(input);
phrase.Id = Guid.NewGuid();
_phraseRepository.Insert(phrase);
}
根据用户提交数据插入一条记录,但在方法末未显式调用SaveChanges方法
在Mvc的Controller里调用上述方法的代码如下:
[AbpAuthorize]
public ActionResult Create()
{
ViewBag.Count = _phraseAppService.GetCount();
return View();
} [AbpAuthorize]
[HttpPost]
[ValidateInput(false)]
public ActionResult Create(FormCollection fc)
{
CheckModelState(); if ((fc.Get("editorValue") != null) && (fc.Get("ChineseMean") != null))
{
//ueditor有时会在最后多出一个br换行,需要去掉.
var sentenceHtml = fc.Get("editorValue"); var phrase = new PhraseCreateDto
{
ChineseMean = fc.Get("ChineseMean"),
SentenceHtml = sentenceHtml,
//1.去掉Html标签 2.把单引号,双引号等被转义的字符转回来.
Sentence = Server.HtmlDecode(Common.ReplaceHtmlMark(sentenceHtml))
};
_phraseAppService.CreatePhrase(phrase);
} return Create();
}
在_phraseAppService.CreatePhrase(phrase),插入记录之后,再调用无参的Create方法,在Create方法里ViewBag.Count = _phraseAppService.GetCount()得到的记录数,仍然是原来的记录数(并没有+1),也就是说插入数据发生在获取记录数之后,如果在CreatePhrase方法末显式调用当前工作单元的SaveChanges方法,每次就能获得最新的记录数:
public void CreatePhrase(PhraseCreateDto input)
{var phrase = Mapper.Map<Phrase>(input);
phrase.Id = Guid.NewGuid();
_phraseRepository.Insert(phrase);
CurrentUnitOfWork.SaveChanges();
}
还有一点需要注意:工作单元与事务这二者的关系,假如有如下代码:
public void CreatePhrase(PhraseCreateDto input)
{
using (var uow=UnitOfWorkManager.Begin())
{
var phrase = Mapper.Map<Phrase>(input);
phrase.Id = Guid.NewGuid();
_phraseRepository.Insert(phrase);
uow.Complete();
}
throw new Exception($"the exception inner {nameof(CreatePhrase)}");
}
在调用UnitOfWorkHanle的Complete之后,抛出一个异常,那么有没有插入数据呢?答案是不一定,因为在应用服务方法里默认的就是一个工作单元,再在方法里面建一个更小范围的工作单元,并不一定会创建一个事务,而有可能使用已经有的事务,而已有的事务归外层的工作单元管理,所以调用Complete方法并不会提交事务,所以抛出异常后,外层的工作单元就会回滚事务.
不过Begin有几个重载,例如:

Required:默认值,如果事务不存在则新建,如果已存在,则用之.
RequiresNew:始终新建事务.所以如果使用:var uow=UnitOfWorkManager.Begin(TransactionScopeOption.RequiresNew),则在抛出异常前提交事务.
Suppress:抑制外界的事务,工作单元域内的所有操作会被提交.
Abp之工作单元与事务的更多相关文章
- ABP框架 - 工作单元
文档目录 本节内容: 简介 在ABP中管理连接和事务 约定的工作单元 UnitOfWork 特性 IUnitOfWorkManager 工作单元详情 禁用工作单元 非事务性工作单元 工作单元方法调用另 ...
- 手工搭建基于ABP的框架 - 工作单元以及事务管理
一个业务功能往往不只由一次数据库请求(或者服务调用)实现.为了功能的完整性,我们希望如果该功能执行一半时出错,则撤销前面已执行的改动.在数据库层面上,事务管理实现了这种完整性需求.在ABP中,一个完整 ...
- ABP的工作单元
http://www.aspnetboilerplate.com/Pages/Documents/Unit-Of-Work 工作单元位于领域层. ABP的数据库连接和事务处理: 1,仓储类 ASP ...
- 【ABP】工作单元——不进行事物独立执行功能
1.注入 private readonly IUnitOfWorkManager unitOfWorkManager; 2.构造 3.开启新事物 using (var unitOfWork = uni ...
- ABP理论学习之工作单元(Unit of Work)
返回总目录 本篇目录 公共连接和事务管理方法 ABP中的连接和事务管理 仓储类 应用服务 工作单元 工作单元详解 关闭工作单元 非事务的工作单元 工作单元方法调用其它 工作单元作用域 自动保存 IRe ...
- 基于DDD的.NET开发框架 - ABP工作单元(Unit of Work)
返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...
- ABP官方文档翻译 3.6 工作单元
工作单元 介绍 ABP中的连接和事务管理 传统的工作单元方法 控制工作单元 UnitOfWork特性 IUnitOfWorkManager 工作单元详情 禁用工作单元 无事务工作单元 一个工作单元方法 ...
- [Abp vNext 源码分析] - 4. 工作单元
一.简要说明 统一工作单元是一个比较重要的基础设施组件,它负责管理整个业务流程当中涉及到的数据库事务,一旦某个环节出现异常自动进行回滚处理. 在 ABP vNext 框架当中,工作单元被独立出来作为一 ...
- EntityFrameworkCore之工作单元的封装
1. 简介 2. DbContext 生命周期和使用规范 2.1. 生命周期 2.2. 使用规范 2.3. 避免 DbContext 线程处理问题 3. 封装-工作单元 3.1. 分析 3.2. 设计 ...
随机推荐
- Golang LicenseServer授权服务器的设计 与 RSA 密钥对的应用
//TODO 待写文章 目录: 1.为什么要写授权服务器 LicenseServer 2.授权服务器的设计思路 3.授权服务器所使用到的加密技术 1.为什么要写授权服务器 为了防止别人拿到二进制后, ...
- Go语言无锁队列组件的实现 (chan/interface/select)
1. 背景 go代码中要实现异步很简单,go funcName(). 但是进程需要控制协程数量在合理范围内,对应大批量任务可以使用"协程池 + 无锁队列"实现. 2. golang ...
- 20、MySQLdb
MySQLdb win64位安装python-mysqldb1.2.5 ubuntu下安装MySQLdb sudo apt-get install python-MySQLdb 导入MySQLdb库 ...
- AttributeError: 'dict' object has no attribute 'has_key'
运行下面的代码: if (locals().has_key('data')): del data gc.collect() 出错: if (locals().has_key('data')): Att ...
- Google Guava Stopwatch(计时器)
Stopwatch stopwatch =newStopwatch().start(); //do something test for(int i =0; i <10000; i++){ } ...
- Linux 修改时区
CentOS 7修改方式如下: # lsb_release -a --查看系统版本-CentOS Linux release 7.6 # timedatectl --查看当前系统时区# ls ...
- phpBB3导入帖子的Python脚本
关联的数据表 在phpBB3中导入用户时, 需要处理的有两张表, 一个是 topics, 一个是 posts.为了方便与原数据关联, 需要在这两个表上新增一个字段并建立唯一索引 ALTER TABLE ...
- .NET 同步与异步 之 EventWaitHandle(Event通知) (十三)
本随笔续接:.NET 同步与异步 之 Mutex (十二) 在前一篇我们已经提到过Mutex和本篇的主角们直接或间接继承自 WaitHandle: Mutex类,这个我们在上一篇已经讲过. Event ...
- MySQL技术内幕读书笔记(七)——锁
锁 锁是数据库系统区分与文件系统的一个关键特性.为了保证数据一致性,必须有锁的介入.数据库系统使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性. lock与latch 使用命令 ...
- Atitit 热烈庆祝读经器项目圆满完成
Atitit 热烈庆祝读经器项目圆满完成 1.1. 读经器项目简单介绍 1 1.2. 一万小时定律和十年一个专家定律 1 1.3. 获得加持前景 1 1.4. 核心源码 1 1.5. 项目git 2 ...