环境: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之工作单元与事务的更多相关文章

  1. ABP框架 - 工作单元

    文档目录 本节内容: 简介 在ABP中管理连接和事务 约定的工作单元 UnitOfWork 特性 IUnitOfWorkManager 工作单元详情 禁用工作单元 非事务性工作单元 工作单元方法调用另 ...

  2. 手工搭建基于ABP的框架 - 工作单元以及事务管理

    一个业务功能往往不只由一次数据库请求(或者服务调用)实现.为了功能的完整性,我们希望如果该功能执行一半时出错,则撤销前面已执行的改动.在数据库层面上,事务管理实现了这种完整性需求.在ABP中,一个完整 ...

  3. ABP的工作单元

    http://www.aspnetboilerplate.com/Pages/Documents/Unit-Of-Work 工作单元位于领域层.   ABP的数据库连接和事务处理: 1,仓储类 ASP ...

  4. 【ABP】工作单元——不进行事物独立执行功能

    1.注入 private readonly IUnitOfWorkManager unitOfWorkManager; 2.构造 3.开启新事物 using (var unitOfWork = uni ...

  5. ABP理论学习之工作单元(Unit of Work)

    返回总目录 本篇目录 公共连接和事务管理方法 ABP中的连接和事务管理 仓储类 应用服务 工作单元 工作单元详解 关闭工作单元 非事务的工作单元 工作单元方法调用其它 工作单元作用域 自动保存 IRe ...

  6. 基于DDD的.NET开发框架 - ABP工作单元(Unit of Work)

    返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...

  7. ABP官方文档翻译 3.6 工作单元

    工作单元 介绍 ABP中的连接和事务管理 传统的工作单元方法 控制工作单元 UnitOfWork特性 IUnitOfWorkManager 工作单元详情 禁用工作单元 无事务工作单元 一个工作单元方法 ...

  8. [Abp vNext 源码分析] - 4. 工作单元

    一.简要说明 统一工作单元是一个比较重要的基础设施组件,它负责管理整个业务流程当中涉及到的数据库事务,一旦某个环节出现异常自动进行回滚处理. 在 ABP vNext 框架当中,工作单元被独立出来作为一 ...

  9. EntityFrameworkCore之工作单元的封装

    1. 简介 2. DbContext 生命周期和使用规范 2.1. 生命周期 2.2. 使用规范 2.3. 避免 DbContext 线程处理问题 3. 封装-工作单元 3.1. 分析 3.2. 设计 ...

随机推荐

  1. Linux命令之vi篇

    作业二: 1)  使用vi编辑器编辑文件/1.txt进入编辑模式写入内容“hello world” [root@localhost ~]# vi 1.txt 2)  进入命令行模式复制改行内容,在下方 ...

  2. MediaInfo代码阅读

      MediaInfo是一个用来分析媒体文件的开源工具. 支持的文件非常全面,基本上支持所有的媒体文件. 最近是在做HEVC开发,所以比较关注MediaInfo中关于HEVC的分析与处理. 从Meid ...

  3. [PHP] 多表外连接性能测试及优化

    原文:https://blog.csdn.net/tang_huan_11/article/details/41925639 版权声明:本文为博主原创文章,转载请附上博文链接!

  4. C# Winform使用Windows Media Player播放多媒体整理

    一.简单使用示例步骤 1.添加Windows Media Player 组件当前是系统的 Com组件 工具箱>右键“选择项”>选择Com组件 2.控件拖拽到桌面,使用 private vo ...

  5. PDF.js 分片下载的介绍2:分片下载demo

    上一个章节,简要说了以下分片下载的几个特性.今天主要用示例说明一下pdf.js分片下载. 服务器环境: php7.2 nginx 1.14 ubuntu 18.04测试浏览器:谷歌浏览器 70.0.3 ...

  6. Js实现Table动态添加一行的小例子

    <form id="form1" runat="server"> <div> <table id=" style=&qu ...

  7. [STF手机设备管理平台]连接其它操作系统上的安卓设备实操介绍

    一.背景 看到之前曾有人发贴,贴名[stf 连接各操作系统上安卓设备的操作方法分享],介绍了一下,虽然说方法和理论都有,但下述评论中还是有很多人不知如何操作,特别是不知道stf provider命令如 ...

  8. 单片机成长之路(51基础篇) - 022 N76e003 APROM模拟EEPROM驱动

    N76e003单片机内部没有EEPROM,但是可以使用 APROM模拟EEPROM功能,代码如下: eeprom.h #ifndef _EEPROM_H_ #define _EEPROM_H_ //E ...

  9. 【Zend Studio】在Zend Studio中调试ThinkPhp框架

    在这篇文章中,笔者将会展示如何在Zend Studio下进行断点调试Think PHP.环境:windows 7.wampServer 3.1.4 64bit.zend studio 13.6.1Th ...

  10. 企业和个人都需要的终极跨平台全端解决方案 UniApp

    相信大家在平时开发过程中都会遇到这两类问题: 很多中小型企业要快速开发一个产品,这个产品至少需要覆盖平台范围为:ios.Android.web/H5.微信/支付宝小程序,那么需要的投入的人力成本.时间 ...