文章目录

  • 一、 Spring 事务管理简介
  • 二、Spring 事务管理器
    • 1、Spring 事务管理接口
      • 1.1、 PlatformTransactionManager 接口
      • 1.2、 TransactionDefinition 接口
      • 1.3、 TransactionStatus 接口
    • 2、Spring 中包含的事务管理器
  • 三、 事务的传播行为
  • 四、 Spring 声明式事务管理
    • 1、Jar 包依赖
    • 2、使用 XML 文件方式实现声明式事务管理
      • 2.1、 搭建环境
        • 创建项目
        • 创建实体类
        • 创建持久层
        • 创建业务层
        • 配置 Spring JDBC
      • 2.2、 实现业务案例
        • 修改持久层
        • 修改业务层
        • 创建测试类
      • 2.3、 配置 Spring 声明式事务管理
        • 开启 aop 命名空间
        • 开启 tx 命名空间
        • 配置声明式事务管理
        • 启动 Spring 框架加载多个配置文件
      • 2.4、 声明式事务中属性解释
        • name 属性
        • propagation 属性
        • isolation 属性
        • readonly 属性
        • timeout 属性
        • rollback-for 属性
        • no-rollback-for 属性
    • 3、使用注解方式实现声明式事务管理
      • 1、 @Transactional 介绍
      • 2、 使用注解配置声明式事务管理的实现方式
        • 注册事务管理驱动
        • 使用@Transactional 实现事务控制

一、 Spring 事务管理简介

在 Spring 框架中事务管理有两种方式:一种是传统的编程式事务管理,即通过编写代码实现的事务管理;另一种是基于 AOP 技术实现的声明式事务管理。由于在 Spring 框架中,编程式事务管理很少使用,所以我们只对 Spring 的声明式事务管理进行详细讲解。
Spring 的声明式事务管理在底层采用了 AOP 技术,其最大的优点在于无须通过编程的方式管理事务,只需要在配置文件中进行相关的规则声明,就可以将事务规则应用到业务逻辑中。

Spring 实现声明式事务管理主要有两种方式:

  • 基于 XML 文件方式的声明式事务管理。
  • 通过 Annotation 注解方式的事务管理。

二、Spring 事务管理器

在 Spring 框架中提供了多种事务管理器来进行事务管理。Spring 的事务管理器是基于AOP 实现的。在 Spring 的事务管理器中包含了配置事务传播行为、隔离级别、只读和超时属性,这些属性提供了事务应用的方法和描述策略。
在 Java EE 项目开发经常会使用分层模式,Spring 的事务处理位于业务逻辑层,它提供了针对事务的解决方案。

1、Spring 事务管理接口

在 Spring 的事务模块(spring-tx-5.2.7.RELEASE.jar)中包括事务管理的三个核心接口。

1.1、 PlatformTransactionManager 接口

PlatformTransactionManager 接口是 Spring 提供的事务管理器接口,用于管理事务。Spring 将事务的配置详细信息封装到 TransactionDefinition 对象中,然后通过事务管理器的getTransaction() 方法获得事务的状态(TransactionStatus),并对事务进行下一步的操作。
该接口中提供了三个事务操作方法,具体如下:

1.2、 TransactionDefinition 接口

TransactionDefinition 接口是事务定义(描述)的对象,它提供了事务相关信息获取的方法,其中包括五个操作,具体如下:

1.3、 TransactionStatus 接口

TransactionStatus 接口是事务的状态,它描述了某一时间点上事务的状态信息。其中包括六个操作,具体如下:

2、Spring 中包含的事务管理器

三、 事务的传播行为

事务传播行为是指:多个含有事务的方法相互调用时,事务如何在这些方法间传播。

四、 Spring 声明式事务管理

Spring 声明式事务管理实现方式:

  • 基于 XML 文件方式实现声明式事务管理。
  • 通过 Annotation 注解方式实现声明式事务管理。

1、Jar 包依赖

Spring 核心容器模块:
spring-beans-5.2.7.RELEASE.jar
spring-context-5.2.7.RELEASE.jar
spring-core-5.2.7.RELEASE.jar
spring-expression-5.2.7.RELEASE.jar

Spring JDBC 模块:
spring-jdbc-5.2.7.RELEASE.jar

Spring 事务模块:
spring-tx-5.2.7.RELEASE.jar

Spring AOP 模块:
spring-aop-5.2.7.RELEASE.jar

AspectJ 框架:
aspectjweaver-1.9.5.jar

Spring 整合 AspectJ 框架模块:
spring-aspects-5.2.7.RELEASE.jar

Commons-Loggin 日志:
commons-logging-1.2.jar

数据库驱动:
mysql-connector-java-5.1.48.jar

2、使用 XML 文件方式实现声明式事务管理

2.1、 搭建环境

创建项目

创建实体类

public class Users {private int userid;private String username;private String usersex;public int getUserid() {return userid;}public void setUserid(int userid) {this.userid = userid;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getUsersex() {return usersex;}public void setUsersex(String usersex) {this.usersex = usersex;}@Overridepublic String toString() {return "Users{" +"userid=" + userid +", username='" + username + '\'' +", usersex='" + usersex + '\'' +'}';}
}
public class Orders {private int orderid;private double orderprice;public int getOrderid() {return orderid;}public void setOrderid(int orderid) {this.orderid = orderid;}public double getOrderprice() {return orderprice;}public void setOrderprice(double orderprice) {this.orderprice = orderprice;}@Overridepublic String toString() {return "Orders{" +"orderid=" + orderid +", orderprice=" + orderprice +'}';}
}

创建持久层

public interface UsersDao {}
public class UsersDaoImpl implements UsersDao {private JdbcTemplate jdbcTemplate;public JdbcTemplate getJdbcTemplate() {return jdbcTemplate;}public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}
}

创建业务层

public interface UsersService {}
public class UsersServiceImpl implements UsersService {private UsersDao usersDao;public UsersDao getUsersDao() {return usersDao;}public void setUsersDao(UsersDao usersDao) {this.usersDao = usersDao;}
}

配置 Spring JDBC

<?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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!--        配置解析Properties文件的工具类--><context:property-placeholder location="db.properties"/><!--    配置数据源--><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></bean><!--    配置JdbcTemplate--><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean><!--    配置持久层--><bean id="usersDao" class="com.bjsxt.dao.impl.UsersDaoImpl"><property name="jdbcTemplate" ref="jdbcTemplate"/></bean><!--    配置业务层--><bean id="usersService" class="com.bjsxt.service.impl.UsersServiceImpl"><property name="usersDao" ref="usersDao"/></bean>
</beans>

2.2、 实现业务案例

业务案例:添加用户的同时添加一个订单。

修改持久层

public interface UsersDao {void insertUsers(Users users);void insertOrders(Orders orders);
}
public class UsersDaoImpl implements UsersDao {private JdbcTemplate jdbcTemplate;public JdbcTemplate getJdbcTemplate() {return jdbcTemplate;}public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}//添加用户@Overridepublic void insertUsers(Users users) {String sql = "insert into users values(default,?,?)";Object[] args = new Object[]{users.getUsername(),users.getUsersex()};this.jdbcTemplate.update(sql,args);}//添加订单@Overridepublic void insertOrders(Orders orders) {String sql = "insert into orders values(default,?,null)";Object[] args = new Object[]{orders.getOrderprice()};this.jdbcTemplate.update(sql,args);}
}

修改业务层

public interface UsersService {void addUsersAndOrders(Users users, Orders orders);
}
public class UsersServiceImpl implements UsersService {private UsersDao usersDao;public UsersDao getUsersDao() {return usersDao;}public void setUsersDao(UsersDao usersDao) {this.usersDao = usersDao;}@Overridepublic void addUsersAndOrders(Users users, Orders orders) {this.usersDao.insertUsers(users);this.usersDao.insertOrders(orders);}
}

创建测试类

public class Test {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-service.xml");UsersService usersService = (UsersService)applicationContext.getBean("usersService");Users users = new Users();users.setUsername("HUAWEI");users.setUsersex("male");Orders orders = new Orders();orders.setOrderprice(800);usersService.addUsersAndOrders(users,orders);}
}

2.3、 配置 Spring 声明式事务管理

开启 aop 命名空间

xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd

开启 tx 命名空间

xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd

配置声明式事务管理

<?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: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.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><import resource="applicationContext-service.xml"/><!--        配置事务管理器切面对象--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--        需要注入数据源对象--><property name="dataSource" ref="dataSource"/></bean><!--    配置事务管理器属性--><tx:advice id="txAdvice"><tx:attributes>
<!--            name:执行受事务控制的方法。配置方法:1.给定完全方法名。2.通过*统配符指定方法名-->
<!--            propagation:配置事务的传播行为-->
<!--            isolation:配置事务的隔离级别--><tx:method name="add*" propagation="REQUIRED" isolation="DEFAULT"/></tx:attributes></tx:advice><!--    配置切面--><aop:config>
<!--        配置切点--><aop:pointcut id="txPointcut" expression="execution(* com.bjsxt.service.*.*(..))"/>
<!--        配置切面--><aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/></aop:config></beans>

启动 Spring 框架加载多个配置文件

public class Test {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[]{"applicationContext-service.xml","applicationContext-tx.xml"});UsersService usersService = (UsersService)applicationContext.getBean("usersService");Users users = new Users();users.setUsername("HUAWEI11");users.setUsersex("male");Orders orders = new Orders();orders.setOrderprice(1800);usersService.addUsersAndOrders(users,orders);}
}

2.4、 声明式事务中属性解释

name 属性

name=”方法名称|方法名称*” 指定受事务控制的方法,支持*通配符。

propagation 属性

propagation=”传播行为名称” 配置事务的传播行为。

isolation 属性

Isolation=”隔离级别名称” 配置事物的隔离级别。

readonly 属性

readonly=”true|false” 是否为只读事务。
true:开启只读事务。由于只读事务不存在数据的修改,因此数据库将会为只读事务提供一些优化手段,会对性能有一定提升。建议在查询中开启只读事务。
false:不开启只读事务,默认为 false。

timeout 属性

timeout=”秒”
timeout 是设置超时属性。以秒为单位。当在限定的时间内不能完成所有操作,就会抛异常。

rollback-for 属性

rollback-for=”异常名称” Spring 默认情况下会对 RunTimeException 类型异常进行事务回滚。如果是 Exception 类型的异常则不回滚。
注意:如果异常被 try{}catch{}了,事务就不回滚了,如果想让事务回滚则必须再抛出异常。

no-rollback-for 属性

no-rollback-for=”异常名称” 当出现什么异常时不滚回事务。

3、使用注解方式实现声明式事务管理

1、 @Transactional 介绍

@Transactional 注解 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该注解来覆盖类级别的定义。
虽然@Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。

2、 使用注解配置声明式事务管理的实现方式

注册事务管理驱动

<?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: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.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><import resource="applicationContext-service.xml"/><!--    配置事务管理器的切面--><bean id="txTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!--    注册事务管理驱动--><tx:annotation-driven transaction-manager="txTransactionManager"/>
</beans>

使用@Transactional 实现事务控制

@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT)
public class UsersServiceImpl implements UsersService {private UsersDao usersDao;public UsersDao getUsersDao() {return usersDao;}public void setUsersDao(UsersDao usersDao) {this.usersDao = usersDao;}@Overridepublic void addUsersAndOrders(Users users, Orders orders) {this.usersDao.insertUsers(users);this.usersDao.insertOrders(orders);}
}

Spring 事务管理的详细讲解及使用相关推荐

  1. Spring 事务管理简介

    在 Spring 框架中事务管理有两种方式:一种是传统的编程式事务管理,即通过编写代码实现的事务管理:另一种是基于 AOP 技术实现的声明式事务管理.由于在 Spring 框架中,编程式事务管理很少使 ...

  2. Spring事务管理 与 SpringAOP

    1,Spring事务的核心接口 Spring事务管理的实现有许多细节,如果对整个接口框架有个大体了解会非常有利于我们理解事务,下面通过讲解Spring的事务接口来了解Spring实现事务的具体策略.  ...

  3. Spring事务管理(详解+实例)

    写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: ...

  4. Spring进阶(五):Spring事务管理(详解+实例)

    文章目录 一.前言 二.核心接口 2.1 事务管理器 2.1.1 JDBC事务 2.1.2 Hibernate事务 2.1.3 Java持久化API事务(JPA) 2.1.4 Java原生API事务 ...

  5. Spring 事务管理机制概述

    摘要: 一般地,用户的每次请求都对应一个业务逻辑方法,而一个业务逻辑方法往往包括一系列数据库原子访问操作,并且这些数据库原子访问操作应该绑定成一个事务来执行.然而,在使用传统的事务编程策略时,程序代码 ...

  6. 关于事务管理的理解和Spring事务管理详解

    转载于:http://www.mamicode.com/info-detail-1248286.html 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000 ...

  7. Spring事务管理(转载自佚名大神)

    我的文章是转载大神的,是大神文章中一小部分,请看: http://www.mamicode.com/info-detail-1248286.html 1.初步理解 比如你去ATM机取1000块钱,大体 ...

  8. spring事务管理一:关于事务管理的接口

    2019独角兽企业重金招聘Python工程师标准>>> spring事务管理主要有三个接口: 事务管理器接口:PlatformTransactionManager.可以为不同的框架提 ...

  9. Spring事务管理机制

    Spring事务管理的四个优点: 提供一致的对于不同的事务管理的API 支持声明式事务管理(重点) 编程事务管理(在开发中应用比较少) 优秀的整合与Spring的数据访问 我们重点讲解spring的事 ...

最新文章

  1. CentOS7 自定义登录前后欢迎信息
  2. 使用SHA256证书进行微软数字签名代码签名
  3. mysql key uni_uni app 踩坑实录
  4. PHP中常见的五种设计模式
  5. 线性-LR-softmax傻傻分不清楚
  6. win10解决java多版本java -version问题
  7. 数据科学 IPython 笔记本 7.5 数据索引和选择
  8. Android之本地摄像头,Android之调用本地摄像头
  9. 开课吧python小课学了有用吗-Python学得好,升职加薪下班早
  10. 如何不装软件查看 Mac 温度?
  11. zend调试php,Zend Studio使用教程:在Zend Studio中调试PHP(4/5)
  12. CPU的睿频、超线程、SIMD指令集等特性对密码算法性能的影响
  13. 管理科学基础知识__后悔值计算
  14. 使用cairo和freetype进行字体布局和渲染
  15. 【_ 面試 】在单点登录中,如果 cookie 被禁用了怎么办?
  16. Excel如何快速录入数字转为大写金额公式
  17. 盘点这些年3D打印机技术给我们带来了的影响
  18. Windows 7下VS2008升级补丁
  19. CNN经典之VGG网络+PyTorch复现
  20. Android Sensor分析

热门文章

  1. r语言x c(-1 -2),R语言apply系列介绍
  2. killall 命令终止进程用法
  3. 游戏系统数值建模过程设计
  4. keycode值对照表_JS键盘与keyCode值对照表
  5. 苹果推出 Mac OS X | 历史上的今天
  6. Docker 安装 ElasticSearch
  7. Unity Shader漫反射光照模型与半兰伯特光照模型
  8. C#进阶学习--抽象方法(abstract)
  9. Tenth day阿里云天池打卡之宝可梦数据分析
  10. android网络请求回调管理,Android网络请求回调没正常走 处理方案