1. 声明式事务管理分类

声明式事务管理也有两种常用的方式,

一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。

显然基于注解的方式更简单易用,更清爽。

2. spring事务特性

spring所有的事务管理策略类都继承自org.springframework.transaction.PlatformTransactionManager接口

其中TransactionDefinition接口定义以下特性:事务隔离级别、事务传播行为、事务超时、事务只读属性、spring事务回滚规则等;

其实这些特性的介绍,网上一堆,在这我就不再啰嗦了,接下来我只想告诉你到底如何使用。

3. 声明式事务管理配置两种方式

如下都将以mybatis为例。

3.1 基于@Transactional注解的

1、首先来看一段代码 spring.xml

<!-- MyBatis begin --><!-- 1、mybatis文件配置,扫描所有mapper文件 --><bean class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 设置MyBatis核心配置文件 --><property name="configLocation" value="classpath:resources/mybatis/mybatis-config.xml" /><!-- 设置数据源 --><property name="dataSource" ref="dataSource" /><!-- 它表示我们的Mapper文件存放的位置,当我们的Mapper文件跟对应的Mapper接口处于同一位置的时候可以不用指定该属性的值。 --><property name="mapperLocations" value="classpath:/mappings/**/*.xml" /><!-- 那么在Mapper文件里面就可以直接写对应的类名 而不用写全路径名了  --><!-- 跟mybatis中<typeAliases>作用一样 --><!-- <property name="typeAliasesPackage" value="com.jeenotes.ssm.pojo"/> --></bean><!-- 2、spring与mybatis整合配置,扫描所有dao,在单数据源的情况下可以不写sqlSessionFactoryBeanName --><bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /><!-- 设置Mapper扫描包,注意扫描的是java-dao-接口文件,不是xml --><property name="basePackage" value="com.jeenotes.ssm.dao" /></bean><!-- 3、定义事务 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean><!-- 4、开启事务控制的注解支持,配置 Annotation 驱动,扫描@Transactional注解的类定义事务  --><tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/><!-- MyBatis end -->

这个文件时spring和mybatis配置中的,细心的你可能会发现,这1234,4个配置之间通过id存在关联关系的。

2、添加tx名字空间

xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"

补充一下:添加到spring.xml上边的头部分,至于不明白xmlns,xmlns:xsi,xsi:schemaLocation等含义的同学,可以考虑看一下这篇文章了。

关于XML文档的xmlns、xmlns:xsi和xsi:schemaLocation详解

3、基于注解式小结

综上,MyBatis自动参与到spring事务管理中,无需额外配置,只要org.mybatis.spring.SqlSessionFactoryBean引用的数据源与DataSourceTransactionManager引用的数据源一致即可,也就是那些id要对应起来,否则事务管理会不起作用。

3.2 基于tx和aop名字空间的xml配置式

同样还是以mybatis为例,主要为aop切面配置,只看xml就可以了

注意:通常这种方式的配置我们都需要再创建一个xml文件:spring-trans.xml

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd"><!-- 事务管理器 --><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!-- 数据源 --><property name="dataSource" ref="dataSource" /></bean><!-- 通知 --><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><!-- 传播行为 --><tx:method name="save*" propagation="REQUIRED" /><tx:method name="insert*" propagation="REQUIRED" /><tx:method name="add*" propagation="REQUIRED" /><tx:method name="create*" propagation="REQUIRED" /><tx:method name="delete*" propagation="REQUIRED" /><tx:method name="update*" propagation="REQUIRED" /><tx:method name="find*" propagation="SUPPORTS" read-only="true" /><tx:method name="select*" propagation="SUPPORTS" read-only="true" /><tx:method name="get*" propagation="SUPPORTS" read-only="true" /></tx:attributes></tx:advice><!-- 切面 --><aop:config><aop:advisor advice-ref="txAdvice"pointcut="execution(* com.jeenotes.ssm.service.*.*(..))" /></aop:config>
</beans>

4. 声明式事务配置总结

通过上方步骤三的配置相信你已经学会如何配置声明式事务管理了,最后总结一下:

1、首先要明确上边的两种方式都是声明式事务管理的表现形式,思路千万不要乱。

2、两种方式配置后的使用规则

2.1、通过3.1第一种的配置,以后就可以在类、或者方法上使用@Transactional注解了(相信有的小伙伴还不知道该注解可以用在方法或者类上边吧),

加入该注解的类或者方法,在执行过程中就会加入到同一事务中,同生共死。

通常你会看到这样的写法,@Transactional(readOnly = true),不得不补充一下@Transactional的属性

属性 类型 描述
value String 可选的限定描述符,指定使用的事务管理器
propagation enum: Propagation 可选的事务传播行为设置
isolation enum: Isolation 可选的事务隔离级别设置
readOnly boolean 读写或只读事务,默认读写
timeout int (in seconds granularity) 事务超时时间设置
rollbackFor Class对象数组,必须继承自Throwable 导致事务回滚的异常类数组
rollbackForClassName 类名数组,必须继承自Throwable 导致事务回滚的异常类名字数组
noRollbackFor Class对象数组,必须继承自Throwable 不会导致事务回滚的异常类数组
noRollbackForClassName 类名数组,必须继承自Throwable 不会导致事务回滚的异常类名字数组

2.2、通过3.2第二种的配置,会对方法名有要求,在上方的配置中举个例子,

<tx:method name="save*" propagation="REQUIRED" />,比如如果saver中方法名是以save开头的就会加入事务。

@Service
public class ItemCatServiceImpl implements ItemCatService {@Autowiredprivate TbItemCatDao itemCatDao;@Overridepublic void saveItemCat(EasyUITreeNode node) {itemCatDao.save(node);}
}

不知道你是否会好奇propagation属性,该属性里的属性值你可以理解成@Transactional注解属性值,如下补充一下

事务传播行为类型

说明

REQUIRED

如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

SUPPORTS

支持当前事务,如果当前没有事务,就以非事务方式执行。

MANDATORY

使用当前的事务,如果当前没有事务,就抛出异常。

REQUIRES_NEW

新建事务,如果当前存在事务,把当前事务挂起。

NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

NEVER

以非事务方式执行,如果当前存在事务,则抛出异常。

NESTED

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类 似的操作。

3、项目中的使用选择。

在实际项目中,这两种方式采用哪一种实现效果都一样,其实到底采用哪一种要看项目需求,重要的是往往并不是你去配置,所以你只需要知道有这两种方式就行喽。

本文地址:http://www.cnblogs.com/niceyoo/articles/8732891.html

spring声明式事务管理方式( 基于tx和aop名字空间的xml配置+@Transactional注解)相关推荐

  1. spring事物配置,声明式事务管理和基于@Transactional注解的使用

    事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或 ...

  2. spring事务配置,声明式事务管理和基于@Transactional注解的使用

    事务管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring提供了几个关于事务处理的类: TransactionDefinition //事务属性定义 Transc ...

  3. 【Spring学习笔记 九】Spring声明式事务管理实现机制

    什么是事务?事务就是把一系列的动作当成一个独立的工作单元,这些动作要么全部完成,要么全部不起作用,关乎数据准确性的地方我们一定要用到事务,防止业务逻辑出错. 什么是事务管理,事务管理对于企业应用而言至 ...

  4. [JAVAEE]实验06:基于XML和基于注解的声明式事务管理方式模拟银行转账程序

    一.实验目的: 熟练掌握声明式事务管理. 二.实验内容: 编写一个模拟银行转账的程序,要求在转账时通过Spring对事务进行控制. 三.实验要求: 分别使用基于XML和基于注解的声明式事务管理方式来实 ...

  5. Spring声明式事务管理实现及原理详解

    目录 1.实现步骤 1.1.配置事务管理器 1.2.启动事务注解 1.3.业务添加注解 2.代码演示 2.1.bean文件 2.2.目标类 2.3.测试类 3.Spring事务属性 3.1.传播行为 ...

  6. Spring声明式事务管理、事务的传播行为xml配置

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. <tx:method name="insert*" propagat ...

  7. Spring声明式事务管理中的事务回滚

    一:使用 本文在spring + spring mvc + mybatis中使用 第一步配置xml:注意xml最前面tx名称空间一定要配置 <beans xmlns="http://w ...

  8. Spring声明式事务管理

    事务管理方式 1.编码方案 不建议使用,它具有侵入性.在原有的业务代码基础上去添加事务管理代码 2. 声明式事务控制,基于AOP对目标进行代理,添加around环绕通知. 这种方案,它不具有侵入性,不 ...

  9. Spring声明式事务管理的配置详解

    环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可.添加方法: 点击项目右键->Build Path->Add ...

最新文章

  1. JAVA课堂作业整理一
  2. hihocoder 第113周 Fibonacci(动态规划)
  3. wxWidgets:wxArchiveClassFactory类用法
  4. Linux系统编程21:基础IO之全缓冲和行缓冲的区别及深刻理解缓冲区及其作用
  5. Linux 命令执行顺序控制
  6. 【bat批处理】常用bat批处理内部命令简介
  7. ask调制流程图_FSK、MSK、ASK调制方式自动识别模块分析设计
  8. SketchUp Pro 2018 for Mac(草图大师)免激活注册版
  9. arcgis显示后台错误_arcgis desktop遇到严重的应用程序错误,无法继续的解决方案...
  10. Doxygen错误error:failed to run html help compiler on index.hhp
  11. 平台为王:Microsoft Office System为什么成功?
  12. windows 命令行 通过驱动名删除打印机
  13. iPhone X 适配(全)
  14. 联想笔记本PE启动热键
  15. 英文论文审稿意见汇总
  16. libvirt 问题解决记录集
  17. Android实战——第三方服务之Bmob后端云的答题系统小项目(四)
  18. 【HNS】试着领一下 HandShake 为开源社区发放的 HNS Coin
  19. 搭建简单的Netty开发环境
  20. 你对C++头文件了解多少?——盘点C++的常用头文件

热门文章

  1. 工作380-js判断是否为空
  2. [html] html和html5有什么区别呢?
  3. [css] css3和css2的区别是什么?
  4. 前端学习(2781):底部tabber配置
  5. “睡服”面试官系列第五篇之proxy(建议收藏学习)
  6. 前端学习(1534):服务器和客户端传输
  7. 前端学习(310):清除浮动的方法
  8. 第三十六期:人工智能统计调查:86%的消费者更喜欢人工客服
  9. 树莓派使用STEP3:更换镜像源
  10. RMSE、MAPE、准确率、召回率、F1、ROC、AUC总结