Spring事务管理--[基于XML的配置]

我觉得自己写的不好,所以先贴一个写的好的帖子

感觉看完不用回来了。。。。

这是一个大佬写的的博客 : https://www.cnblogs.com/yixianyixian/p/8372832.html

第一:JavaEE 体系进行分层开发,事务处理位于业务层,Spring 提供了分层设计业务层的事务处理解决方

案。

第二:spring 框架为我们提供了一组事务控制的接口。具体在后面的第二小节介绍。这组接口是在

spring-tx-5.0.2.RELEASE.jar 中。

第三:spring 的事务控制都是基于 AOP 的,它既可以使用编程的方式实现,也可以使用配置的方式实现。我

们学习的重点是使用配置的方式实现。

API 介绍

PlatformTransationManager

Spring提供了一个事务管理器接口PlatformTransationManager,该接口包含了三个方法:

  • getTransation()//提交事务
  • commit();//提交事务
  • rollback();//回滚事务

在开发中,根据应用的技术不同,使用不同的实现类

SpringJDBC / iBatis:org.springframework.jdbc.datasource.DataSourceTransactionManager

Hibernate:org.springframework.orm.hibernate5.HibernateTransactionManager

TransactionManager

Transactionmanager是事务信息对象,定义了与事务信息相关的方法

获取事务对象名称String getName()

获取事务隔离级别int getIsolationLevel()

获取事务传播行为int getPropagationBehavior()

获取事务超时时间getTimeOut()

获取事务是否为只读IsReadOnly()

TransactionManager的隔离级别和传播行为有固定的参数

隔离级别

ISOLATION_DEFAULT ---(数据库)默认基本

ISOLATION_READ_UNCOMMITTED ---可读取未提交的数据

ISOLATION_READ_COMMITTED --- 只能读取已提交的数据(oracle默认级别)

ISOLATION_REPEATABLE_READ --- 是否读取其他事务提交修改后的数据,解决不可重复读的问题(mysql默认级别)

ISOLATION_SERIALIZABLE --- 是否读取其他事务提交添加后的数据,解决幻影读问题

事务传播行为

REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选

择(默认值)

SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)

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

REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。

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

NEVER:以非事务方式运行,如果当前存在事务,抛出异常

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

事务超时时间:默认-1没有时间限制,以秒为单位

TransationStatus

这个接口提供了事务的运行状态

flush();刷新事务

hasSavepoint();是否在存储点

isCompleted();是否完成

isNewTransaction();是否是新事务

isRollbackOnly();是否回滚事务

setRollbackOnly();设置事务回滚

基于XML的配置

首先最基本几件事:导入jar包/坐标,导入(xml)约束

spring-jdbc包,spring-tx包,aspectjweaver

如果需要测试,需要加上junit-4.12,spring-test

约束

这个可以在文档里找到

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

DAO

真正与数据库交互的层

在准备dao之前应准备表的实体类[略]

dao层的接口,只写连个,其他的方法都类似

public interface IDeptDao {

    List<Dept> findAll(Integer id);

    void Update(Dept dept);

}

实现类继承JdbcDaoSupport,减少代码冗余

public class DeptDaoImpl extends JdbcDaoSupport implements IDeptDao {

    public List<Dept> findAll(Integer id) {
        return null;
    }

    public void Update(Dept dept) {
        int update = getJdbcTemplate().update("update dept set deptno= ? where dname = ‘a‘ ",dept.getDeptno());
        System.out.println("更改后----"+update);
    }
}

Service层

根据DAO层,准备Service层的接口实现类

接口

public interface IDeptSer {

    List<Dept> findAll(Integer id);

    void Update(Dept dept);

}

这里的实现类直接调用对应的方法

public class DeptSerImpl implements IDeptSer {

    private DeptDaoImpl deptDao;

    public void setDeptDao(DeptDaoImpl deptDao) {
        this.deptDao = deptDao;
    }

    public List<Dept> findAll(Integer id) {
        return deptDao.findAll(id);
    }

    public void Update(Dept dept) {
            deptDao.Update(dept);
            dept.setDeptno(80);
//            int k = 0/0;//手动制造异常
            deptDao.Update(dept);
    }

}

xml配置

与数据库交互的写好了,现在就是配置了

配置数据源

<!--数据源-->
<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    <property name="url" value="jdbc:mysql:///test"></property>
    <property name="username" value="root"></property>
    <property name="password" value="1234"></property>
</bean>

配置dao层和service

<!--dao层实现类-->
<bean id="deptDao" class="gx.dao.impl.DeptDaoImpl">
    <property name="dataSource" ref="datasource"></property>
</bean>
<!--service层实现类-->
<bean id="ds" class="gx.ser.impl.DeptSerImpl">
    <property name="deptDao" ref="deptDao"></property>
</bean>

事务管理

终于到了重点了

配置时间到

配置步骤

  1. 配置事务管理器

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="datasource"></property>
        </bean>
    
  2. 配置事务管理器的通知引用事务管理器
  3. 配置事务的属性
    <!--第二步-->
    <tx:advice id="txAdcvice" transaction-manager="transactionManager">
        <!--第三步-->
        <tx:attributes>
        	<tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>
    
  4. 配置AOP切入点表达式
  5. 配置切入点表达式和事务通知的对应关系
<aop:config>
    <!--第四步-->
    <aop:pointcut id="pt1" expression="execution(* gx.ser.impl.*.*(..))"/>
    <!--第五步-->
    <aop:advisor advice-ref="txAdcvice" pointcut-ref="pt1"></aop:advisor>
</aop:config>

tx:method标签

属性:name --- 方法名称

可用 通配符* 例:

匹配所有find开头的方法:find*(优先级高)

匹配所有方法:*

其他属性

指定方法名称:是业务核心方法

read-only:是否是只读事务。默认 false,不只读。

isolation:指定事务的隔离级别。默认值是使用数据库的默认隔离级别。

propagation:指定事务的传播行为。

timeout:指定超时时间。默认值为:-1。永不超时。

rollback-for:用于指定一个异常,当执行产生该异常时,事务回滚。产生其他异常,事务不回滚。

没有默认值,任何异常都回滚。

原文地址:https://www.cnblogs.com/platinumcat/p/12595561.html

时间: 2024-10-28 09:51:07

Spring事务管理--[基于XML的配置]的相关文章

spring事务管理,xml配置aop事务和注解配置aop事务

xml配置和注解配合共同代码 AccountService.java public interface AccountService { //转账方法 void transfer(Integer from,Integer to,Double money); } AccountServiceImpl.java xml配置aop事务的AccountServiceImpl.java public class AccountServiceImpl implements AccountService {

spring事务管理(xml配置)与spring自带连接数据库JdbcTemplate

什么是事务,很通俗的话来说就是,我们日常生活中总会出现在银行转账的业务,加入A向B转账100元,此时A的账户中应该减少100元,B的账户中增加100元,但是如果在A转完账B还没有接受的时候,服务器出现了故障,一般银行的系统都会给出交易失败的提示,并且A的账户中总金额也不会变,那么这就类似一个事务. 1.事务是单个逻辑单元工作单位执行的一系列操作 2.多个操作作为整体向系统提交,要么都执行,要么都不执行 3.事务时一个不可分割的逻辑单元 事务的4大特性:原子性.一致性.隔离性.持久性(ACID)

Spring事务管理实现原理及MySQL InnoBD引擎行锁概述

Spring实现事务管理的机制 Spring事务管理是基于AOP编程思想实现,Spring框架被广泛使用的原因之一,就是提供了强大的事务管理机制. AOP是什么?我们常说的AOP并不是指一种开发技术,而是一种编程思想,AOP的核心概念就是面向切面编程,实现可插拔,降低程序之前的耦合性,提高重用性. Spring AOP 基于动态代理实现,一种是JDK动态代理,另一种是CGLIB动态代理. spring2.5之前声明式事务可以这样实现: ?<!-- 声明使用的spring事务管理器--> <

Spring事务管理之几种方式实现事务(转)

一:事务认识 大家所了解的事务Transaction,它是一些列严密操作动作,要么都操作完成,要么都回滚撤销.Spring事务管理基于底层数据库本身的事务处理机制.数据库事务的基础,是掌握Spring事务管理的基础.这篇总结下Spring事务. 事务具备ACID四种特性,ACID是Atomic(原子性).Consistency(一致性).Isolation(隔离性)和Durability(持久性)的英文缩写. (1)原子性(Atomicity) 事务最基本的操作单元,要么全部成功,要么全部失败,

Spring事务管理之几种方式实现事务

也可以参考https://blog.csdn.net/liuhaiabc/article/details/52450167 https://blog.csdn.net/baidu_37107022/article/details/77481670 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committed.Repeatable read.Serializable,这四个级别可以逐个解决脏读.不可重复读.幻读这几类问题. √: 可能出现    ×: 不

spring学习笔记:spring事务管理 (转)

关于事物隔离级别, 脏读, 不可重复读, 幻读的理解, 另有一篇文章比较生动的介绍:http://blog.csdn.net/sunxing007/article/details/6427290 spring事务管理相关的接口: TransactionDefinition:代表一个事物,描述了事务的隔离级别, 超时时间,事务是否只读, 传播规则等等; TransactionStatus:描述事物的状态; PlatformTransactionManager:事务管理器接口, 只定义了3个方法:g

(spring-第2回)Spring的Schema,基于XML的配置(在IoC容器中装配Bean的前奏片)

要深入了解Spring机制,首先需要知道Spring是怎样在IoC容器中装配Bean的.而了解这一点的前提是,要搞清楚Spring基于Schema的Xml配置方案. 在深入了解之前,必须要先明白几个标签的意思(我会逐步引导读者理解,刚开始的懵懂无所谓,读者自会渐入佳境.初极狭,才通人.复行数十步,豁然开朗.). 什么是XML Schema? 用来描述 XML文档的结构,也被简称为XSD(XML Schema Definition),是一些规则的集合.(方式:通过定义schema文件 如 spri

Spring事务管理-使用注解配置事务

一.概述 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framework对事务管理提供了一致的抽象,其特点如下:为不同的事务API提供一致的编程模型,比如JTA(Java Transaction API), JDBC, Hibernate, JPA(Java Persistence API和JDO(Java Data Objects)支持声明式事务管理,特别是基于注解的声明式事务管理,简单易用 提供比其他事务API如JTA更简单的编程式事务管理

spring 事务管理配置

一般的,我们把事务配在service层,利用service的业务逻辑接口统一的管理. 为什么不用在dao层呢? 因为一个service有可能调用多个dao,而这多个dao有可能相互联系,有时候一个操作需要调用多次数据库,但是这多次调用要么全提交,要么全回滚. 因此,在dao层调用事务理论上说不是一个很明智的选择.应该有业务逻辑层service层负责事务,统一处理. Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三