Spring添加声明式事务
一、前言
Spring提供了声明式事务处理机制,它基于AOP实现,无须编写任何事务管理代码,所有的工作全在配置文件中完成。
二、声明式事务的XML配置方式
为业务方法配置事务切面,需要用到tx和aop两个命名空间下的标签,先在Spring配置文件中导入这两个命名空间。
1、配置事务管理器组件
事务管理器组件提供对事务处理的全面支持和统一管理,在切面中相当于增强处理的角色。这里使用Spring提供的事务管理器类DataSourceTransactionManager来实现,如下
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
配置DataSourceTransactionManager时,要为其注入事先定义好的数据源组件
2、配置事务增强
通过<tx:advice>标签配置事务增强,绑定事务管理器并针对不同方法定义事务规则
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="find*" propagation="SUPPORTS"/>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
其中transaction-manager属性引用和一个事务管理器Bean,transaction-manager属性的默认值是transactionManager,也就是说,如果定义的事务管理器Bean的名称是transactionManager,则可以不用指定该属性值
通过<tx:attributes>子标签定制事务属性,事务属性通过<tx:method>标签进行设置。Spring支持对不同的方法设置不同的事务属性所以可以为一个<tx:advice>设置多个<tx:method>
<tx:method>标签中的name属性是必需的,用于指定匹配的方法。若要对方法名进行约定,可以使用通配符(*)。其他属性均为可选,用于指定具体的事务规则,如下
暂时省略......
3、配置切面
最后还要定义切面,将事务增强与方法切入点结合,将事务规则应用到指定的方法上
<!-- 定义切面 -->
<aop:config>
<!-- 定义切入点 -->
<aop:pointcut id="serviceMethod" expression="execution(* edu.cn.service..*.*(..))"/>
<!-- 将事务增强与切入点结合 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/>
</aop:config>
aop:advisor的advice-ref属性引用的是通过<tx:advice>标签设定了事务属性的组件
三、声明式事务的注解添加方式
Spring还支持使用注解配置声明式事务,所使用的注解是@Transactional。首先仍然需要在Spring配置文件中配置事务管理器,并添加对注解配置的事务的支持,如下
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="txManager"/>
经过上述配置,程序便支持使用@Transactional注解来配置事务了
import org.springframework.transaction.annotation.Transaction
import org.springframework.stereotype.Service; @Transaction
@Service("userService")
public class UserServiceImpl implements UserService{
@Autowired
private UserMapper userMapper; @Override
@Transaction(propagation = Propagation.SUPPORTS)
public List<User> findUsersWithConditions(User user){
//省略
} @Override
public boolean addNewUser(User user){
//省略
}
}
在业务类上添加@Transactional注解即可为该类的所有业务方法统一添加事务处理。如果某一业务方法需要采用不同的事务规则,可以在该业务方法上添加@Transactional注解进行单独设置。
@Transactional注解也可以设置事务属性的值,默认的@Transactional设置如下
暂时省略......
这些默认值当然也是可以改变的,如下
暂时省略......
Spring添加声明式事务的更多相关文章
- Spring之声明式事务
在讲声明式事务之前,先回顾一下基本的编程式事务 编程式事务: //1.获取Connection对象 Connection conn = JDBCUtils.getConnection(); try { ...
- 【Spring】——声明式事务配置详解
项目中用到了spring的事务: @Transactional(rollbackFor = Exception.class, transactionManager = "zebraTrans ...
- 使用注解实现Spring的声明式事务管理
使用注解实现Spring的声明式事务管理,更加简单! 步骤: 1) 必须引入Aop相关的jar文件 2) bean.xml中指定注解方式实现声明式事务管理以及应用的事务管理器类 3)在需要添加事务控制 ...
- 保护亿万数据安全,Spring有“声明式事务”绝招
摘要:点外卖时,你只需考虑如何拼单:选择出行时,你只用想好目的地:手机支付时,你只需要保证余额充足.但你不知道这些智能的背后,是数以亿计的强大数据的支持,这就是数据库的力量.那么庞大数据的背后一定会牵 ...
- spring aop 声明式事务管理
一.声明式事务管理的概括 声明式事务(declarative transaction management)是Spring提供的对程序事务管理的方式之一. Spring的声明式事务顾名思义就是采用声明 ...
- Spring AOP声明式事务异常回滚(转)
转:http://hi.baidu.com/iduany/item/20f8f8ed24e1dec5bbf37df7 Spring AOP声明式事务异常回滚 近日测试用例,发现这样一个现象:在业务代码 ...
- @Transactional、Spring的声明式事务
传送门 一.Spring的声明式事务 需要在xml文件中配置 <!--配置事务管理器类--> <bean id="transactionManager" clas ...
- Spring(四)Spring JdbcTemplate&声明式事务
JdbcTemplate基本使用 01-JdbcTemplate基本使用-概述(了解) JdbcTemplate是spring框架中提供的一个对象,是对原始繁琐的Jdbc API对象的简单封装.spr ...
- 重新学习Spring注解——声明式事务
36.声明式事务-环境搭建 37.声明式事务-测试成功 38.[源码]-声明式事务-源码分析 /** * 声明式事务: * * 环境搭建: * 1.导入相关依赖 * 数据源.数据库驱动.Spring- ...
随机推荐
- poj 2376 Cleaning Shifts 贪心 区间问题
<pre name="code" class="html"> Cleaning Shifts Time Limit: 1000MS Memory ...
- CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)H
题面 被神葱安利安利了本题. 我们贪心的想,如果有那么一坨相等的学号,那么肯定是保留一个人学号不变,其余的再推到学号+1的位置(准备与那个位置的其他人合并)处理. 虽然a[i]可大至1e18,不过如果 ...
- 【BZOJ4176】 Lucas的数论
Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目“求Sigma(f(i)),其中1<=i<=N”,其 ...
- jeecg中自定义dialog,实现窗体的弹出
自定一个dialog,在子窗体中写一个方法,然后通过iframe进行调取function createwindowoktext(title, addurl,width,height,oktext,ca ...
- 超好用的富文本编辑器Summernote的使用
官网地址 中文文档 源码下载地址 Summernote依赖于jquery和bootstrap3/4 所以用时记得引入这俩依赖 奉上引入方法(官网说的很清楚,api也很详细): <!-- in ...
- Java并发之CAS的三大问题
在Java并发包中有一些并发框架也使用了自旋CAS的方式实现了原子操作,比如:LinkedTransferQueue类的Xfer方法.CAS虽然很高效的解决了原子操作,但是CAS仍然存在三大问题:AB ...
- TCP主动打开 之 第三次握手-发送ACK
假定客户端执行主动打开,并且已经收到服务器发送的第二次握手包SYN+ACK,在经过一系列处理之后,客户端发送第三次握手包ACK到服务器:其流程比较简单,主要是分配skb,初始化ack包并发送:需要注意 ...
- 尚学堂requireJs课程---2、模块
尚学堂requireJs课程---2.模块 一.总结 一句话总结: # 将代码以及使用放到独立的闭包中去,并且赋值给了变量,便于外部访问 # return出了函数和变量(放在一个json对象中) # ...
- GPS定位RTK解决方案
GPS差分: 实时差分定位是指在测量点上实时得到高精度的定位结果.这种模式的具体方法是:在一个已知测站上架设GPS基准站接收机和数据电台,连续跟踪所有可见卫星,并通过数据电台向移动站发送差分改正数据. ...
- Groovy脚本基础全攻略
1 背景 Groovy脚本基于Java且拓展了Java,所以从某种程度来说掌握Java是学习Groovy的前提,故本文适用于不熟悉Groovy却想快速得到Groovy核心基础干货的Java开发者(注意 ...