spring 声明式事务管理详解
前言:spring框架对于事务管理提供了两种方案。一,编程式事务、二,声明式事务。本例主要剖析 声明式事务。
何为声明式事务:
通过spring的配置文件配置事务规则,或使用spring @Transactional注解两种方式通知我们系统中哪些方法需要引入事务支持。
使用配置文件配置事务

1 <!-- 使用spring声明式事务 -->
2 <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
3 <property name="sessionFactory" ref="mySessionFactory"></property>
4 </bean>
5
6 <tx:advice id="txAdvice" transaction-manager="transactionManager">
7 <tx:attributes>
8 <tx:method name="add*" propagation="REQUIRED" />
9 <tx:method name="del*" propagation="REQUIRED" />
10 <tx:method name="mod*" propagation="REQUIRED" />
11 <tx:method name="*" propagation="REQUIRED" read-only="true" />
12 </tx:attributes>
13 </tx:advice>
14
15 <aop:config>
16 <aop:pointcut id="interceptorPointCuts"
17 expression="execution(*
18 news.dao.*.*(..))" />
19 <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" />
20 </aop:config>

解析:① 由于本例是给数据访问层的方法添加事务管理,因此我们需要配置一个org.springframework.orm.hibernate5.HibernateTransactionManager ,这个类的一个bean。
② tx:advice节点则是配置我们需要引入事务管理类的方法名,这里spring允许我们使用通配符(*)。
③ aop:config这个节点则是配置我们的工程中有哪些类以及哪些方法需要引入事务管理,同理依旧可以使用通配符。本例news.dao.*.*(..))这句的意义为:我们工程中news包下面的dao包下面的所有类以及所有方法都需要引入事务管理。
使用spring注解实现事务管理

1 @Override
2 @Transactional(readOnly=true)
3 public List showAllNews() {
4 List<News> allNewList = nd.showAllNews();
5 //在return 之间,可以进行各种业务逻辑操作,本例省略
6
7 return allNewList;
8 }

解析:以上代码段是截取自业务层某一个方法的片段,在这里我们只需要加入@Transactional这一个spring的注解就是这么简单就可以实现事务管理了,同时我们配置文件中也无需配置tx:advice和aop:config这两个比较麻烦的节点了。
总结:两种方式都可以实现事务管理,使用注解一步到位,为什么我们还要学一个这么复杂的xml文件配置来实现事务管理呢。博主在当时学习的时候同样有这样的疑问。在这里我简单解析一下这两者如何取舍。一,xml文件配置可以实现使我们的代码简化,并一定程度上与代码解耦,一旦我们的工程需要替换框架,只需改动配置,而无需改动源码。二,使用注解可以非常直观的理解我们的源码,提高了可读性,不过只建议在一个相对较小,框架固定的工程中使用。具体该使用哪种方式还得依据具体情况分析。
spring 声明式事务管理详解的更多相关文章
- spring 事物(三)—— 声明式事务管理详解
spring的事务处理分为两种: 1.编程式事务:在程序中控制事务开始,执行和提交:详情请点此跳转: 2.声明式事务:在Spring配置文件中对事务进行配置,无须在程序中写代码:(建议使用) 我对&q ...
- Spring声明式事务配置详解
Spring支持编程式事务管理和声明式的事务管理. 编程式事务管理 将事务管理代码嵌到业务方法中来控制事务的提交和回滚 缺点:必须在每个事务操作业务逻辑中包含额外的事务管理代码 声明式事务管理 一般情 ...
- Spring声明式事务@Transactional 详解,事务隔离级别和传播行为
@Transactional注解支持9个属性的设置,这里只讲解其中使用较多的三个属性:readOnly.propagation.isolation.其中propagation属性用来枚举事务的传播行为 ...
- 【Spring】——声明式事务配置详解
项目中用到了spring的事务: @Transactional(rollbackFor = Exception.class, transactionManager = "zebraTrans ...
- Spring声明式事务管理与配置介绍
转至:http://java.9sssd.com/javafw/art/1215 [摘要]本文介绍Spring声明式事务管理与配置,包括Spring声明式事务配置的五种方式.事务的传播属性(Propa ...
- spring 声明式事务管理
简单理解事务: 比如你去ATM机取5000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉5000元钱:然后ATM出5000元钱.这两个步骤必须是要么都执行要么都不执行.如果银行卡扣除了5000块但 ...
- Spring声明式事务管理基于@Transactional注解
概述:我们已知道Spring声明式事务管理有两种常用的方式,一种是基于tx/aop命名空间的xml配置文件,另一种则是基于@Transactional 注解. 第一种方式我已在上文为大 ...
- Spring声明式事务管理基于tx/aop命名空间
目的:通过Spring AOP 实现Spring声明式事务管理; Spring支持编程式事务管理和声明式事务管理两种方式. 而声明式事务管理也有两种常用的方式,一种是基于tx/aop命名空间的xml配 ...
- XML方式实现Spring声明式事务管理
1.首先编写一个实体类 public class Dept { private int deptId; private String deptName; public int getDeptId() ...
随机推荐
- Java--比较方便的特性归纳,持续更新...
1.import 关键字不仅可以导入包,还可以静态变量和方法. 2.内部类对象会依赖于外部类对象,除非已经存在一个外部类对象,否则类中不会出现内部类对象.也就是说实例化内部类对象时,必须使用外部类对象 ...
- gulp基于node流的自动化构建工具
GULP 在我才接触gulp的时候 看他就是一个 通过压缩各种文件来提升用户体验的开发工具 那是因为 对他的理解并不深 他真正强大 之处 在于他的 管子 .pipe() 可以 ...
- Zabbix实战-简易教程(6)--Server端高可用
3.4 server前端高可用 至此,单台Zabbix server环境已经搭建完成,为了达到高可用效果,我们需要通过2台服务器之间通过HA软件进行探测,一旦检测到主的server挂掉后,从的s ...
- Linux系统从安装开始
已经很久很久没来得及写博客了,想想之前自己开始安装使用Linux系统的尝试,好像很简单!下面开始Linux系统的安装:这里推荐U盘安装 首先你必须下载一个U盘ISO镜像写入工具,本人使用USBWrit ...
- spring mvc的跨域解决方案
什么是跨域 一句话:同一个ip.同一个网络协议.同一个端口,三者都满足就是同一个域,否则就是跨域. 为什么非得跨域 基于两个方面: a. web应用本身是部署在不同的服务器上 b.基于开发的角度 -- ...
- redis4.0 集群,jedis客户端连接配置
使用jedis 2.9.0连接,异常信息: redis.clients.jedis.exceptions.JedisDataException: ERR Client sent AUTH, but n ...
- 51 nod 1297 管理二叉树
原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1297 先是暴力加优化T了最后两个点…… 我还是来想想正解吧. ...
- hihoCoder #1043 : 完全背包(板子题)
#1043 : 完全背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说之前的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的 ...
- div排版+文档流+定位秘诀
由于没有找到自己认为完整的关于普通流.浮动和绝对定位的中文文章,于是鼓起勇气决定自己来写篇. 在普通流中的 Box(框) 属于一种 formatting context(格式化上下文) ,类型可以是 ...
- TypeScript笔记 6--接口
接口定义 接口和Java语言一样,都是通过关键字interface定义的,如下例子: interface People { name: string; age: number; hobby?: str ...