Abp之工作单元与事务
来源:互联网 发布:变化怎样发生 知乎 编辑:程序博客网 时间:2024/05/28 11:47
环境: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之工作单元与事务
- Abp之工作单元与事务
- ABP官方文档翻译 3.6 工作单元
- ABP官方文档(十九)【工作单元】
- 一个逻辑工作单元必须满足ACID才能称为事务
- abp项目之旅
- 企业应用架构模式之工作单元模式
- 单元的工作空间
- 工作单元和线程
- ABP之动态WebAPI(二)
- 后台工作者HangFire与ABP框架Abp.Hangfire及扩展
- P单元与H单元
- SAP LUW 逻辑工作单元
- Unit Of Work--工作单元
- Mysql之事务与视图
- 字符集与编码五之代码单元及length方法
- [BZOJ3998][TJOI2015]弦论 后缀自动机
- 【UVa - 455】
- CleanCode《代码整洁之道》读书笔记
- POJ - 3278----Catch That Cow
- C# 判断文件编码
- Abp之工作单元与事务
- [后缀自动机 线段树] BZOJ 1396 识别子串 & BZOJ 2865 字符串识别
- 44、判断是否符合指定格式
- 字符串面试题(四)— 判断一个字符串是否为另外一个字符串旋转之后的字符串
- Android系统启动流程(一)解析init进程启动过程
- 重新复习C语言 大多数还是语法、算法的问题
- 如果选择了战斗,就该去尽全力试一次
- 素数判定
- uva 11045My T-shirt suits me