关闭

Spring JDBC-使用XML配置声明式事务

标签: xmlspring事务
1728人阅读 评论(0) 收藏 举报
分类:

系列

Spring对事务管理的支持概述以及 编程式的事务管理

Spring JDBC-使用XML配置声明式事务

Spring JDBC-使用注解配置声明式事务


概述

大多数开发者选择声明式事务管理的功能,这种方式对代码的侵入性最小,可以让事务管理完全从业务代码中移除,非常符合非侵入式轻量容器的理念。

Spring的声明式事务管理是通过AOP实现的,通过事务的声明性信息,Spring负责将事务管理增强逻辑动态的织入到业务方法的相应连接点中。 这些逻辑包括获取线程绑定资源、开始事务、提交/回滚事务、进行异常转换和处理等工作。


基于aop/tx命名空间的配置

Spring2.0引入了AspectJ切面定义语言,这使得事务方法切面描述变得更加简单。

Spring在基于Schema的配置中添加了一个tx命名空间,在配置文件中以明确结构化的方式定义事务属性,大大提高了配置事务属性的便利性。


示例

代码已托管到Github—> https://github.com/yangshangwei/SpringMaster

这里写图片描述

我们来看下关于事务管理的配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 引入其他xml -->
    <import resource="classpath:com/xgj/dao/transaction/xmlTrans/conf_txaop_base.xml"/>

    <!-- 使用强大的切点表达式语言轻松定义目标方法 -->
    <aop:config proxy-target-class="true">
        <!-- 通过aop定义事务增强切面 -->
        <aop:pointcut id="serviceMethod" 
             expression="execution(* com.xgj.dao.transaction.xmlTrans.service.*Service.*(..))" />   
        <!-- 引用切面和事务增强 -->
        <aop:advisor pointcut-ref="serviceMethod"   advice-ref="txAdvice"/>
    </aop:config>

    <!-- 事务增强 -->
    <tx:advice id="txAdvice"  transaction-manager="transactionManager" >
        <!-- 事务属性定义 -->
        <tx:attributes>
            <tx:method name="get*" read-only="true" />
            <tx:method name="add*" rollback-for="Exception"/>
            <tx:method name="update*"/>
        </tx:attributes>
    </tx:advice>

</beans>

在配置文件中引入了

<import resource="classpath:com/xgj/dao/transaction/xmlTrans/conf_txaop_base.xml"/>

在aop命名空间中,通过切点表达式语言,

expression="execution(* com.xgj.dao.transaction.xmlTrans.service.*Service.*(..))"

将com.xgj.dao.transaction.xmlTrans.service包以及所有以Service为后缀的类纳入了需要进行事务增强的范围,并配合 tx:advice的aop:advisor完成了事务切面的定义。

aop:advisor引用txAdvice增强是在tx命名空间上定义的。 首先事务增强一定需要一个事务管理器的支持,tx:advice通过 transaction-manager属性引用定义的事务管理器(默认查找名为transactionManager的事务管理器,所以如果名为transactionManager可以不指定)。

我们在ManagerService类中将addTeacher和addStudent中放在一个事务中

@Service
public class ManagerService {

    private TeacherDao teacherDao;
    private StudentDao studentDao;

    /**
     * 
     * 
     * @Title: addTeacherAndStudent
     * 
     * @Description: 配置文件中<tx:method name="add*" rollback-for="Exception"/>
     *               我们故意经写入student表时,让其异常,看下teacher是否回滚--OK 都没有写入,说明在一个事务中
     *               如果有去掉<tx:method name="add*"
     *               rollback-for="Exception"/>,经验证Teacher可成功增加,说明不在一个事务中
     * 
     *               rollback-for="Exception"这个可不加,默认是回滚的
     * @param teacher
     * @param student
     * 
     * @return: void
     */
    public void addTeacherAndStudent(Teacher teacher, Student student) {
        teacherDao.addTeacher(teacher);
        studentDao.addStudent(student);
    }

因为在配置文件中

 <tx:method name="add*" rollback-for="Exception"/>

所以addTeacherAndStudent中的方法在一个事务中,我们将addStudent中故意写错,让其抛出异常,经验证Teacher也没有欧增加成功,说明配置生效,在一个事务中。

tx:method元素属性

可以使用冒号来定义表格的对齐方式,如下:

属性 是否必须 默认值 描述
name 与事务属性关联的方法名。通配符(*)可以用来指定一批关联到相同的事务属性的方法 如:’get*’、’handle*’、’on*Event’等等。
propagation REQUIRED 事务传播行为
isolation DEFAULT 事务隔离级别
timeout -1 事务超时的时间(以秒为单位) ,如果为-1,则说明事务超时时间由底层的事务系统所决定
read-only false 事务是否只读
rollback-for 所有运行期异常回滚 触发事务回滚的Excepiton,用异常名称的片段进行匹配,可以设置多个,用逗号分开,如Exception1,Exception2
norollback-for 所有检查型异常不回滚 不触发事务回滚的Excepiton,用异常名称的片段进行匹配,可以设置多个,用逗号分开,如Exception1,Exception2

继承自runtimeexception或error的是非检查型异常(运行期异常)

继承自exception的是检查型异常,检查型异常则必须用try语句块进行处理或者把异常交给上级方法处理.

如果需要为不同的业务Bean配置不同的事务管理风格,则可以在aop:config中定义多套事务切面。

基于aop/tx配置的声明式事务管理是实际应用中最常使用的事务管理方式,它的表达能力最强且使用最为灵活。

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Spring声明式事务管理(XML与注解方式)

事务控制概述编程式事务控制自己手动控制事务,就叫做编程式事务控制。 Jdbc代码: Conn.setAutoCommite(false); // 设置手动控制事务 Hibernate代码: Session.beginTransaction(); // 开启一个事务细粒度的事务控制: ...
  • scgaliguodong123_
  • scgaliguodong123_
  • 2015-11-16 17:40
  • 2749

Spring事务管理——使用XML配置声明式事务

事务简介:事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性事务就是一系列的动作,它们被当作一个单独的工作单元。这些动作要么全部完成,要么全部不起作用事务的四个关键属性(ACID)① 原子性(atomicity):事务室一个原子操作,有一系列动作组成。事务的原子性确保动作要么...
  • Evankaka
  • Evankaka
  • 2015-05-08 14:54
  • 11293

事务管理及spring基于注解的声明式事务管理的配置和用法

因为前几天看一个项目文档出现“本系统采用基于Spring的声明式事务控制”,才根据文档和代码了解了一下事务管理的相关知识。这里对自己的学习做个总结。 一:相关概念 1.事务:事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开...
  • guozili1
  • guozili1
  • 2017-02-09 14:01
  • 722

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

一、Spring声明式事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的。 总结如下: Spring配置文件中关于...
  • andyzhaojianhui
  • andyzhaojianhui
  • 2016-07-21 14:47
  • 3365

spring 声明式事务管理注解方式实现

使用注解实现Spring的声明式事务管理,更加简单! 步骤:          1) 必须引入Aop相关的jar文件          2)...
  • u014010769
  • u014010769
  • 2015-07-31 20:09
  • 1751

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

事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。 spring支持编程式事务管理和声明式事务管理两种方式。 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,sp...
  • bao19901210
  • bao19901210
  • 2014-12-04 15:17
  • 131798

spring+springmvc声明式事务失效

spring声明式事务失效
  • qq761427213
  • qq761427213
  • 2016-05-05 10:36
  • 346

spring学习笔记(22)声明式事务配置,readOnly无效写无异常

在上一节内容中,我们使用了编程式方法来配置事务,这样的优点是我们对每个方法的控制性很强,比如我需要用到什么事务,在什么位置如果出现异常需要回滚等,可以进行非常细粒度的配置。但在实际开发中,我们可能并不需要这样细粒度的配置。另一方面,如果我们的项目很大,service层方法很多,单独为每个方法配置事务...
  • qwe6112071
  • qwe6112071
  • 2016-03-26 00:33
  • 2198

SSH:Spring框架(声明式事务管理详解)

声明式事务管理是spring对事务管理的最常用的方式,因为这种方式对代码的影响最小,因此也符合非侵入性的轻量级容器的概念。Spring的事务管理是通过AOP的方式来实现的,因为事务方面的代码与spring的绑定并以一种样板式结构使用。在理解spring声明式事务管理我们首先要理解他是通过AOP怎么具...
  • qq_27550755
  • qq_27550755
  • 2015-11-18 16:55
  • 1151

spring声明式事务管理(基于AspectJ的xml方式)

以银行转账为例(本文只作为自己学习spring的备忘录,只对自己负责) 转账的dao层接口 [java] view plain copy     package com.slowly.springtrancation03;...
  • hanxueyu666
  • hanxueyu666
  • 2017-01-04 19:44
  • 226
    个人资料
    • 访问:1219212次
    • 积分:18061
    • 等级:
    • 排名:第611名
    • 原创:457篇
    • 转载:0篇
    • 译文:5篇
    • 评论:148条
    WeChat
      欢迎关注我的公众号,干货只有干货,还有更多惊喜和资源在等着你
    博客专栏