上篇我们学习了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_REQUIREDPROPAGATION_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/yunchun86/archive/2009/12/10/1621425.html

Spring.NET学习笔记17——事务传播行为(基础篇) Level 200相关推荐

  1. Spring.NET学习笔记10——方法的注入(基础篇) Level 200

    多数用户都会将容器中的大部分对象布署为singleton模式.当一个singleton对象需要和另一个singleton对象协作,或者一个非singleton对象需要和另一个非singleson对象协 ...

  2. Spring.NET学习笔记15——AOP的配置(基础篇) Level 200

    上篇我学习了Spring.NET的四种通知类型,AOP的实现方案比较复杂,是通过代码实现的.而Spring.NET框架给我们提供了配置的方式来实现AOP的功能.到目前为止,我们已经讨论过使用Proxy ...

  3. Spring.NET学习笔记13——AOP的概念(基础篇) Level 200

    上篇我们简单的了解了AOP的应用场景,知道AOP编程的重要性.这篇我们先看一段代码,来开始今天的学习. 回顾与上篇类似的代码:SecurityService类的IsPass判断用户名为"ad ...

  4. Spring.NET学习笔记11——自定义对象行为(基础篇) Level 200

    Spring.NET通过几个专门的接口来控制容器中对象的行为.说到对象的行为无非就要提到对象的生命周期控制.类似在WinForm开发,Form生命周期中,Load方法为Form的载入方法和Dispos ...

  5. Spring.NET学习笔记12——面向切面编程(基础篇) Level 300

    AOP即面向切面编程(Aspect Oriented Programming的缩写),是OOP(面向对象编程)的一种延续形式.是通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添 ...

  6. 动力节点王鹤SpringBoot3学习笔记——第二章 掌握SpringBoot基础篇

    目录 二.掌控SpringBoot基础篇 2.1 Spring Boot ? 2.1.1 与Spring关系 2.1.2 与SpringCloud关系 2.1.3  最新的Spring Boot3 新 ...

  7. Spring.NET学习笔记1——控制反转(基础篇) Level 200

    在学习Spring.NET这个控制反转(IoC)和面向切面(AOP)的容器框架之前,我们先来看一下什么是控制反转(IoC). 控制反转(Inversion of Control,英文缩写为IoC),也 ...

  8. Spring.NET学习笔记8——集合类型的注入(基础篇) Level 200

    Spring.NET还支持集合类型的注入.而且使用起来也比较方便. 一.ILIst类型 使用<list>元素作为ILIst的标签,value为集合中元素的值.也可以注入对象,甚至关联其它对 ...

  9. 黑马程序员C++学习笔记<第一阶段_基础篇>

    配套视频网址: 黑马程序员:http://yun.itheima.com/course/520.html?bili B站:https://www.bilibili.com/video/BV1et411 ...

  10. 前端学习笔记(CSS、JS基础篇)

    CSS篇 注意:css注释使用/ /,而不是<!-- -->或者//,否则很容易导致不明错误!!! div padding:内边距.盒子内容与盒子边框的距离设置,相当于给盒子加了厚度,使用 ...

最新文章

  1. luogu P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现)
  2. XNA 游戏 运行时编辑器
  3. 牛客NOIP暑期七天营-提高组1
  4. linux 驱动入门 魏清,Linux下的SPI总线驱动(三)
  5. ios 图片居中裁剪_iOS实现图片的缩放和居中显示
  6. 文本分类(一)封装分词器
  7. 使用C++11封装线程池ThreadPool
  8. 解决Ubuntu “E: 软件包 vim 还没有可供安装的候选者“问题
  9. 像打字一样插入图标-iconfont
  10. python画xy轴折线在拐点处加汉字_用稳定的方法求曲线的拐点?
  11. 假日活动的背后,酷开网络再造OTT营销的“价值高地”
  12. 流程图基本图形的含义
  13. Windows 7和Windows10 修改文件、文本文档后缀时不显示后缀名真么办?
  14. 迭代法求根c语言程序对数方程,【实验一】方程求根:牛顿迭代法
  15. Android自定义导览地图组件(一)
  16. 你可以跑不赢刘翔,但一定要跑赢CPI
  17. Discuz!教程之应用中心安装插件提示“数据下载错误(105)”的解决办法
  18. Oracle JOB 用法小结 用法 工作 过程 参数 job 执行 运行 SQL 指示 _中国网管联盟_bitsCN.com
  19. 解决看不到IDEA中lambda表达式、lambda不见了
  20. 基于JAVA餐厅座位预约系统设计与实现 开题报告

热门文章

  1. php rsa2 微博,微博登录分析
  2. 串口 浮点数 结构体_quot;结构体quot;和quot;共用体quot;在单片机中的妙用
  3. 小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_4、快速创建SpringBoot应用之自动创建web应用...
  4. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_1_两种获取Stream流的方式...
  5. Zabbix proxy配置
  6. 51Nod - 1385 凑数字
  7. flash无法注册控件
  8. TZOJ 数据结构期末历年题目
  9. configparser ,shelve ,hashlib,random模块
  10. Python标准类型的分类