10.spring声明式事务

一.回顾事务

  • 事务在项目开发过程非常重要,涉及到数据的一致性的问题,不容马虎!

  • 事务管理是企业级应用程序开发中必备技术,用来确保数据的完整性和一致性。

1.事务就是把一系列的动作当成一个独立的工作单元,这些动作要么全部完成,要么全部不起作用。

2.事务四个属性ACID

  1. 原子性(atomicity)

    • 事务是原子性操作,由一系列动作组成,事务的原子性确保动作要么全部完成,要么完全不起作用

  2. 一致性(consistency)
    • 一旦所有事务动作完成,事务就要被提交。数据和资源处于一种满足业务规则的一致性状态中

  3. 隔离性(isolation)
    • 可能多个事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏

  4. 持久性(durability)

    • 事务一旦完成,无论系统发生什么错误,结果都不会受到影响。通常情况下,事务的结果被写到持久化存储器中

二.Spring中的事务管理

1.测试事务的一致性

步骤:(在上一个的博客项目的基础上)

  1. 在UserMapper接口中添加两个方法

    1. addUser:添加用户

    2. deleteUser:删除用户

  2. 在UserMapper.xml中编写SQL语句,故意将delete写成deletes导致出错

  3. 修改UserMapperImpl类

    1. 添加addUser方法

    2. 添加deleteUser方法

    3. 修改selectUser方法,让它先添加一个用户,在删除一个用户最后返回所有用户

在UserMapper接口中添加两个方法

 1 public interface UserMapper {
 2
 3     List<User> selectUser();
 4
 5     //添加用户
 6     int addUser(User user);
 7
 8     //删除用户
 9     int deleteUser(int id);
10 }

在UserMapper.xml中编写SQL语句,故意将delete写成deletes导致出错

1 <insert id="addUser" parameterType="user">
2     insert into mybatis.user (id, name, pwd) value (#{id},#{name},#{pwd});
3 </insert>
4
5 <delete id="deleteUser" parameterType="_int">
6     deletes from mybatis.user where id = #{id};
7 </delete>

修改UserMapperImpl类

 1 public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper {
 2
 3
 4     public List<User> selectUser() {
 5         User user = new User(7,"小明","123456");
 6         UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
 7         mapper.addUser(user);
 8         mapper.deleteUser(7);
 9         return mapper.selectUser();
10     }
11
12     @Override
13     public int addUser(User user) {
14         return getSqlSession().getMapper(UserMapper.class).addUser(user);
15     }
16
17     @Override
18     public int deleteUser(int id) {
19         return getSqlSession().getMapper(UserMapper.class).deleteUser(id);
20     }
21 }

直接运行测试程序发现,添加了用户但没有删除用户,事务没有回滚一致性被破坏

2.Spring的事务管理分为两类:

  • 编程式事务管理(不好,不使用)

    • 将事务管理代码嵌到业务方法中来控制事务的提交和回滚

    • 缺点:必须在每个事务操作业务逻辑中包含额外的事务管理代码

  • 声明式事务管理(好,使用)

    • 一般情况下比编程式事务好用。

    • 将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理。

    • 将事务管理作为横切关注点,通过aop方法模块化。Spring中通过Spring AOP框架支持声明式事务管理。

3.使用声明式事务管理保证事务的ACID

步骤:

  1. 修改spring-dao.xml,导入头部约束信息

  2. 修改spring-dao.xml

    1. 添加声明式事务

    2. 添加结合了AOP配置事务通知

    3. 添加结合了AOP配置切点

修改spring-dao.xml,导入头部约束信息tx

  • xmlns:tx="http://www.springframework.org/schema/tx"
  • http://www.springframework.org/schema/tx
  • http://www.springframework.org/schema/tx/spring-tx.xsd
 1 <beans xmlns="http://www.springframework.org/schema/beans"
 2        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3        xmlns:tx="http://www.springframework.org/schema/tx"
 4        xmlns:aop="http://www.springframework.org/schema/aop"
 5        xsi:schemaLocation="http://www.springframework.org/schema/beans
 6         http://www.springframework.org/schema/beans/spring-beans.xsd
 7         http://www.springframework.org/schema/aop
 8         http://www.springframework.org/schema/aop/spring-aop.xsd
 9         http://www.springframework.org/schema/tx
10         http://www.springframework.org/schema/tx/spring-tx.xsd">

修改spring-dao.xml

 1 <!--4.配置声明式事务
 2         ref:引用我们的数据源
 3     -->
 4     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
 5         <property name="dataSource" ref="dataSource" />
 6     </bean>
 7
 8     <!--5.结合AOP切入,保证事务的一致性-->
 9     <!--配置事务通知-->
10     <tx:advice id="txAdvice" transaction-manager="transactionManager">
11         <tx:attributes>
12             <!--配置哪些方法使用什么样的事务,配置事务的传播特性
13                 1.事务的传播特性:多个事务方法相互调用时,事务如何在这些方法间传播
14                 2.read-only="true":只读不可操作数据
15                 3.propagation:用于配置事务的传播特性
16                 4.propagation="REQUIRED":如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择(默认)。
17             -->
18             <tx:method name="add" propagation="REQUIRED"/>
19             <tx:method name="delete" propagation="REQUIRED"/>
20             <tx:method name="update" propagation="REQUIRED"/>
21             <tx:method name="query" read-only="true"/>
22             <tx:method name="*" propagation="REQUIRED"/>
23         </tx:attributes>
24     </tx:advice>
25
26     <!--6.配置AOP事务切入
27         配置切点为mapper包下的所有类和方法,用于保证事务的ACID
28     -->
29     <aop:config>
30         <aop:pointcut id="txPointcut" expression="execution(* ustc.wzh.mapper.*.*(..))"/>
31         <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
32     </aop:config>

此时测试发现没有添加,事务发生了回滚保证了一致性

将UserMapper.xml中的delete语句修复,依旧执行成功,保证事务一致性

4.总结:

为什么需要配置事务?

  • 如果不配置,就需要我们手动提交控制事务;

  • 事务在项目开发过程非常重要,涉及到数据的一致性的问题,不容马虎!

原文地址:https://www.cnblogs.com/zhihaospace/p/12329488.html

时间: 2024-10-03 15:14:21

10.spring声明式事务的相关文章

Spring声明式事务管理(基于注解方式实现)

----------------------siwuxie095 Spring 声明式事务管理(基于注解方式实现) 以转账为例 1.导入相关 jar 包(共 10 个包) (1)导入核心 jar 包和日志相关的 jar 包 (2)导入 JdbcTemplate 的 jar 包 (3)导入 MySQL 的 JDBC 驱动包 mysql-connector-java 下载链接: https://dev.mysql.com/downloads/connector/j/ (4)导入 AOP 的 jar

JavaEE学习之Spring声明式事务

一.引言 上一篇文章,学习了AOP相关知识,并做了一个简单的Hello world.本文在上篇文章的基础上,进一步学习下Spring的声明式事务. 二.相关概念 1. 事务(Transaction)——它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位 2. 事务的几大特性(A.C.I.D): A——Atomicity(原子性).数据库中的事务执行是作为原子.即不可再分,整个语句要么执行,要么不执行. C——Consistency(一致性).在事务开始之前和事务结束以

spring声明式事务以及配置

使用spring提供的事务处理机制的好处是程序员可以不用关心事务的切面了,只要配置就好了,可以少写代码. spring声明式事务处理 spring 声明:针对的是程序员,程序员告诉spring容器,哪些方法需要事务,哪些方法不需要事务 事务处理   spring容器来做事务处理 目的:让spring管理事务,开发者不再关注事务 spring声明式事务处理的步骤: 1.搭建环境 2.把dao层和service层的接口和类写完 3.在spring的配置文件中,先导入dataSource 4.测试 5

Spring声明式事务的配置~~~

/*2011年8月28日 10:03:30 by Rush  */ 环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可.添加方法: 点击项目右键->Build Path->Add librarys: 打开Add Libraries对话框,然后选定 MyEclipse Libraries: 点击Next,找到Spring 2.0 aop Libraries并勾选上,点击finsh即可. 如果在项目里面能看到下面的库文件,

spring声明式事务配置详解

spring声明式事务配置详解 君子不器 2013年06月16日 编程世界 5273次阅读 查看评论 理解Spring的声明式事务管理实现 本节的目的是消除与使用声明式事务管理有关的神秘性.简单点儿总是好的,这份参考文档只是告诉你给你的类加上@Transactional注解,在配置文件中添加('<tx:annotation-driven/>')行,然后期望你理解整个过程是怎么工作的.此节讲述Spring的声明式事务管理内部的工作机制,以帮助你在面对事务相关的问题时不至于误入迷途,回朔到上游平静

spring 声明式事务管理

简单理解事务: 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都不执行.如果银行卡扣除了1000块但是ATM出钱失败的话,你将会损失1000元:如果银行卡扣钱失败但是ATM却出了1000块,那么银行将损失1000元.所以,如果一个步骤成功另一个步骤失败对双方都不是好事,如果不管哪一个步骤失败了以后,整个取钱过程都能回滚,也就是完全取消所有操作的话,这对双方都是极好的. 当这两个步骤提交了,执行完毕

Spring声明式事务管理与配置详解

转载:http://www.cnblogs.com/hellojava/archive/2012/11/21/2780694.html 1.Spring声明式事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之前对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. 总结如下: Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionMa

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

使用注解实现Spring的声明式事务管理,更加简单! 步骤: 1) 必须引入Aop相关的jar文件 2) bean.xml中指定注解方式实现声明式事务管理以及应用的事务管理器类 3)在需要添加事务控制的地方,写上: @Transactional @Transactional注解: 1)应用事务的注解 2)定义到方法上: 当前方法应用spring的声明式事务 3)定义到类上:   当前类的所有的方法都应用Spring声明式事务管理; 4)定义到父类上: 当执行父类的方法时候应用事务. 案例: 1.

Spring 声明式事务,propagation属性列表及isolation(隔离级别)

Spring 声明式事务,propagation属性列表 TransactionDefinition接口中定义,共有7种选项可用: PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务.这是最常见的选择.PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行.PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常.PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,