前言: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 声明式事务管理详解的更多相关文章

  1. spring 事物(三)—— 声明式事务管理详解

    spring的事务处理分为两种: 1.编程式事务:在程序中控制事务开始,执行和提交:详情请点此跳转: 2.声明式事务:在Spring配置文件中对事务进行配置,无须在程序中写代码:(建议使用) 我对&q ...

  2. Spring声明式事务配置详解

    Spring支持编程式事务管理和声明式的事务管理. 编程式事务管理 将事务管理代码嵌到业务方法中来控制事务的提交和回滚 缺点:必须在每个事务操作业务逻辑中包含额外的事务管理代码 声明式事务管理 一般情 ...

  3. Spring声明式事务@Transactional 详解,事务隔离级别和传播行为

    @Transactional注解支持9个属性的设置,这里只讲解其中使用较多的三个属性:readOnly.propagation.isolation.其中propagation属性用来枚举事务的传播行为 ...

  4. 【Spring】——声明式事务配置详解

    项目中用到了spring的事务: @Transactional(rollbackFor = Exception.class, transactionManager = "zebraTrans ...

  5. Spring声明式事务管理与配置介绍

    转至:http://java.9sssd.com/javafw/art/1215 [摘要]本文介绍Spring声明式事务管理与配置,包括Spring声明式事务配置的五种方式.事务的传播属性(Propa ...

  6. spring 声明式事务管理

    简单理解事务: 比如你去ATM机取5000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉5000元钱:然后ATM出5000元钱.这两个步骤必须是要么都执行要么都不执行.如果银行卡扣除了5000块但 ...

  7. Spring声明式事务管理基于@Transactional注解

    概述:我们已知道Spring声明式事务管理有两种常用的方式,一种是基于tx/aop命名空间的xml配置文件,另一种则是基于@Transactional 注解.         第一种方式我已在上文为大 ...

  8. Spring声明式事务管理基于tx/aop命名空间

    目的:通过Spring AOP 实现Spring声明式事务管理; Spring支持编程式事务管理和声明式事务管理两种方式. 而声明式事务管理也有两种常用的方式,一种是基于tx/aop命名空间的xml配 ...

  9. XML方式实现Spring声明式事务管理

    1.首先编写一个实体类 public class Dept { private int deptId; private String deptName; public int getDeptId() ...

随机推荐

  1. iOS开发证书和配置文件的使用

    提示:之前只是根据网上的流程完成了iOS项目的发布过程,对于证书和配置文件仍是一头雾水,这里参照别人的文章,简单了解一下,毕竟以后用的着. 这里有几个问题: 什么是iOS证书,它是如何与app应用关联 ...

  2. LVS集群之工作原理和调度算法(2)

      LVS的工作机制 LVS里Director本身不响应请求,只是接受转发请求到后方,Realservers才是后台真正响应请求. LVS 工作原理基本类似DNAT,又不完全相像,它是一种四层交换,默 ...

  3. JavaScript获取当前url路径

    1.假设当前页完整地址是:http://localhost:61768/Home/Index?id=2 //获取当前窗口的Url var url = window.location.href; //结 ...

  4. flask开发框架

    # -*- coding: utf-8 -*- # import fcrm from fcrm import app if __name__ == '__main__': # fcrm.app.run ...

  5. ActionBar+Fragment实现顶部标签页

    用ActionBar的TABS模式,和Fragment实现程序顶部的标签页切换. 一. MainActivity         public class MainActivity extends A ...

  6. 详解zkw算法解决最小费用流问题

    网络流的一些基本概念 很多同学建立过网络流模型做题目, 也学过了各种算法, 但是对于基本的概念反而说不清楚. 虽然不同的模型在具体叫法上可能不相同, 但是不同叫法对应的思想是一致的. 下面的讨论力求规 ...

  7. bzoj:2423: [HAOI2010]最长公共子序列

    Description 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0, ...

  8. BZOJ 1509: [NOI2003]逃学的小孩

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1509 直接求出树的直径,枚举每个点更新一遍答案. #include<cstring> ...

  9. FineReport父子格实现动态参数注入

    "深入学习FineReport后发现其功能及其强大,之前使用存储过程实现的报表完全可以使用FineReport本身的功能实现. 当你需要的表名,查询条件等均未知的时候,使用"动态参 ...

  10. [学习OpenCV攻略][011][显示图片]

    学习资料: http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/tutorials.html   包含头文件 core.hpp:包含 ...