环境: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:抑制外界的事务,工作单元域内的所有操作会被提交.

最新文章

  1. Atitit 图像处理和计算机视觉的分类&#160;三部分&#160;图像处理&#160;图像分析&#160;计算机视觉
  2. jquery中attr()与prop()区别
  3. 【BZOJ-3747】Kinoman 线段树
  4. 我的ORM之十三 -- 性能参数
  5. AFnetworking3.1的基本使用
  6. Oracle中建表和指定表空间
  7. navicat MySQL 只有1000条记录
  8. ng-sortable-支持触屏的拖拽排序
  9. POJ1321棋盘问题
  10. 对163k地方门户网站系统QQ互联功能修改
  11. 常用封装--Date篇--获取格式化的日期对象
  12. ThinkPHP第二十天(getField用法、常用管理员表结构、树形结构前小图标CSS)
  13. Windows 8 应用开发 - 磁贴
  14. hihocoder 1496 寻找最大值(高维前缀最大次大值)
  15. 基础数据类型的坑和集合及深浅copy
  16. linux git 安装方法
  17. MySQL--查看内存信息
  18. svn冲突的解决
  19. fragment 小结
  20. DataSetToJSON

热门文章

  1. UIButton高亮状态卡顿
  2. 使用JfreeChart生成图表遇到的问题
  3. Unity3d如何profile模拟器
  4. AlexNet总结
  5. Git上传空文件夹
  6. SSE图像算法优化系列二十五:二值图像的Euclidean distance map(EDM)特征图计算及其优化。
  7. WPF双向数据绑定总结
  8. 最完整苹果IOS个人开发账号升级方法-个人开发账号升级为公司开发者账号常见误区
  9. CSS-2
  10. 【推荐图书】+ 基于Nios II的嵌入式SoPC系统设计与Verilog开发实例+C#入门经典等