上篇我们学习了Spring.NET的事务机制。回顾一下,实现事务需要在方法上标记[Transaction]。在很多情况下,事务往往与业务分离。Spring.NET提供了事务代理帮我们管理这些事务,我们可以通过TransactionProxyFactoryObject使用声明式事务。在很多情况下TransactionProxyFactoryObject比ProxyFactoryObject易用,因为该类可以通过自身属性来指定事务通知和事务特性,所以不需要单独为事务通知定义对象。另外,与使用ProxyFactoryObject不同,TransactionProxyFactoryObject不要求使用方法的全名,只用普通的“短”方法名即可。同时,该类可以对方法名进行wild card matching,从而强制我们为DAO的方法使用统一命名规则。

  TransactionProxyFactoryObject的TransactionAttributes属性是用来配置的传播行为,并规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播:

  PROPAGATION_REQUIRED   支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
  PROPAGATION_SUPPORTS   支持当前事务,如果当前没有事务,就以非事务方式执行。
  PROPAGATION_MANDATORY   支持当前事务,如果当前没有事务,就抛出异常。
  PROPAGATION_REQUIRES_NEW   新建事务,如果当前存在事务,把当前事务挂起。
  PROPAGATION_NOT_SUPPORTED   以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  PROPAGATION_NEVER   以非事务方式执行,如果当前存在事务,则抛出异常。
  PROPAGATION_NESTED   如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

  PROPAGATION_REQUIRED和PROPAGATION_SUPPORTS我用的比较多,其它的很少使用。特别是PROPAGATION_REQUIRED,我绝大多数情况都使用这个行为(如,在创建,删除,修改的时候),我会在查询(获取)数据的时候设置为:PROPAGATION_REQUIRED,readOnly,声明为一个只读事务,这样有助于性能的提高。

  TransactionProxyFactoryObject的Target属性是我们要拦截的对象,一般我们设置为业务层的对象。

  实现代码:

App.config

<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net" 
         xmlns:db="http://www.springframework.net/database">
  <db:provider id="DbProvider"
                provider="SqlServer-1.1"
                connectionString="Server=(local);Database=SpringLesson16;Uid=sa;Pwd=;Trusted_Connection=False"/>
  
  <object id="userDao" type="Dao.UserDao, Dao">
    <property name="AdoTemplate" ref="adoTemplate"/>
  </object>
  <object id="accountDao" type="Dao.AccountDao, Dao">
    <property name="AdoTemplate" ref="adoTemplate"/>
  </object>
  <object id="userService" parent="txProxyTemplate">
    <property name="Target">
      <object type="Service.UserService, Service">
        <property name="UserDao" ref="userDao"/>
        <property name="AccountDao" ref="accountDao"/>
      </object>
    </property>
  </object>
  <object id="adoTemplate" type="Spring.Data.Core.AdoTemplate, Spring.Data">
    <property name="DbProvider" ref="DbProvider"/>
    <property name="DataReaderWrapperType" value="Spring.Data.Support.NullMappingDataReader, Spring.Data"/>
  </object>
  <!--事务管理器-->
  <object id="transactionManager"
         type="Spring.Data.Core.AdoPlatformTransactionManager, Spring.Data">
    <property name="DbProvider" ref="DbProvider"/>
  </object>
  
  <object id="txProxyTemplate" abstract="true"
            type="Spring.Transaction.Interceptor.TransactionProxyFactoryObject, Spring.Data">
    <property name="PlatformTransactionManager" ref="transactionManager"/>
    <property name="TransactionAttributes">
      <name-values>
        <add key="Save*" value="PROPAGATION_REQUIRED"/>
        <add key="Delete*" value="PROPAGATION_REQUIRED"/>
        <add key="Get*" value="PROPAGATION_REQUIRED,readOnly"/>
      </name-values>
    </property>
  </object>
</objects>

  在name-value节点下,key属性为Save*,意思是拦截所有以Save开头的方法,在拦截到的方法上增加PROPAGATION_REQUIRED的事务传播行为。

转载于:https://www.cnblogs.com/millen/archive/2009/12/30/1635979.html

Spring.NET教程(十五)——事务传播行为(基础篇)相关推荐

  1. 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(二)

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 上一讲我们说了CubeMX配置SDRAM的一些基本配置,还有FMC跟SDRAM的讲解,这一讲我们 ...

  2. 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(一)

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 本文 1首先讲解什么是FMC及SDRAM,W9825G6KH芯片原理,2基于CubeMx创建工程 ...

  3. 【Visual C++】游戏开发笔记四十七 浅墨DirectX教程十五 翱翔于三维世界 摄像机的实现

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 本系列文章由zhm ...

  4. 【Visual C++】游戏开发笔记四十七 浅墨DirectX教程十五 翱翔于三维世界:摄像机的实现...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/zhmxy555/article/details/8657656 作者:毛星云(浅墨) ...

  5. 【Visual C++】游戏开发笔记四十七 浅墨DirectX教程十五 翱翔于三维世界:摄像机的实现

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处.   文章链接: http://blog.csdn.net/zhmxy555/article/details/8657656 作者:毛星云( ...

  6. 孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备

    孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天本来应当继续学习Python的数据库操作,但根据过去我自学 ...

  7. 《深入浅出DPDK》读书笔记(十五):DPDK应用篇(Open vSwitch(OVS)中的DPDK性能加速)

    Table of Contents Open vSwitch(OVS)中的DPDK性能加速 174.虚拟交换机简介 175.OVS简介 176.DPDK加速的OVS 177.OVS的数据通路 178. ...

  8. 松滋市瑞星计算机职业学校,【2020职教活动周】学校第十五届计算机操作基础技能大赛顺利举行...

    (本网通讯员:沈小波)为进一步强化学生计算机操作技能训练,提升计算机公共基础实践教学水平,提高育人质量.学校第十五届计算机操作基础技能大赛决赛于11月11日下午在西校区文华楼计算机实训中心顺利举行.学 ...

  9. 热烈庆祝《Vue.js 实战教程 V2.x(一)基础篇》上线了!

    热烈庆祝<Vue.js 实战教程 V2.x(一)基础篇>上线了! 课程简介 课程地址:https://edu.csdn.net/course/detail/25641 机构名称:大华软件学 ...

  10. 机器学习实战教程(二):决策树基础篇之让我们从相亲说起

    机器学习实战教程(二):决策树基础篇之让我们从相亲说起 一.前言 二.决策树 三.决策树的构建的准备工作 1.特征选择 (1)香农熵 (2)编写代码计算经验熵 (3) 信息增益 (4) 编写代码计算信 ...

最新文章

  1. node.js linux shell,bash – Node.js Shell脚本和参数
  2. 扫地机器人腿是咕噜_扫地机器人|如何避免买到“智障”,看这篇
  3. Linux操作系统下Oracle主要监控工具介绍
  4. 推荐系统中使用ctr排序的f(x)的设计-传统模型篇
  5. 【渝粤题库】国家开放大学2021春2441经济数学基础1题目
  6. mfc检测一个目录是否产生新文件_细数Java8中那些让人纵享丝滑的文件操作
  7. Dubbo管理控制台dubbo-admin搭建
  8. SourceInsight工程文件与源文件相对路径
  9. 使用Hbuilder将自己app发布到App Store
  10. OC5021B降压型恒流驱动控制芯片,关断时间可调
  11. IT大学生成长周报 | 第 6 期
  12. 在VC6.0下设置Unicode编译环境
  13. 高德地图定位及导航开发流程
  14. android 包命名不管你怎么命,千万不要用下面几个
  15. 数据分析:企业人力资源管理探索
  16. cmd下访问内部数据库
  17. CDOJ1059-秋实大哥与小朋友
  18. 【Popper报错】Popper: modifier “undefined“ provided an invalid “fn“ property
  19. java获取文件后缀_Java获取文件后缀的两种方式
  20. Linux安装CentOS系统

热门文章

  1. asp.net 域名注册查询接口 支持批量后缀查询
  2. Zookeeper C API 指南二(监视(Wathes), 基本常量和结构体介绍)
  3. 用Visual Studio 2005/2008提取EXE文件中的资源[图片|htm|光标文件]
  4. css工程师技巧,web前端工程师必须掌握的技巧–CSS Sprites技术(附基础操作教程)...
  5. 微型计算机系统视频适配器为,计算机硬件基础1-微型计算机系统组成(含教材6,8,9章内容).ppt...
  6. k1658停运到什么时候_2020年春节快递几号停运 2020年春节快递停运时间电商春节放假通知...
  7. 在Unity进行平台打包发布的时候需要注意的一些细节问题
  8. Mac VMWARE 安装redis
  9. vsftpd安装配置_vsftpd上传文件大小为0(主动模式)
  10. python 自动化发送邮件_干货 | 解放双手,用Python实现自动发送邮件