本文源码:GitHub·点这里 || GitEE·点这里

一、Spring事务管理

1、基础描述

Spring事务管理的本质就是封装了数据库对事务支持的操作,使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交和回滚。

Connection conn = DriverManager.getConnection();
try {  // 自动提交设置为falseconn.setAutoCommit(false);// 执行增删改查操作// 当操作成功后手动提交conn.commit();
} catch (Exception e) {// 出现异常,回滚所有操作conn.rollback();e.printStackTrace();
} finally {conn.colse();
}

2、事务常见概念

  • 事务

事务是指作为单个逻辑工作单元执行的一系列操作(SQL语句)。这些操作要么全部成功,要么全部不成功。

  • 特性:ACID
原子性(Atomicity):事务中的多个操作要么都成功要么都失败
一致性(consistency):事务的执行的前后数据的完整性保持一致
隔离性(isolation):事务执行的过程中,不应该受到其他事务的干扰
持久性(durability):事务一旦结束,数据就持久到数据库
  • 隔离问题

脏读:一个事务读到另一个事务没有提交的数据

不可重复读:一个事务前后多次读取相同数据,数据内容不一致,update场景问题

虚读(幻读):一个事务前后多次读取,数据总量不一致,insert场景问题

  • 隔离级别

read uncommitted:

事务可以读取另一个未提交事务的数据。

read committed

事务要等另一个事务提交后才能读取数据,解决脏读。

repeatable read

在开始读取数据时,事务开启,不再允许修改操作,解决:脏读、不可重复读。

serializable

最高事务隔离级别,事务串行化顺序执行,解决脏读、不可重复读、幻读。但是效率低下,耗数据库性能。

3、事务管理API描述

  • PlatformTransactionManager

平台事务管理器,Spring管理事务,必须使用事务管理器进行事务配置时,核心方法:获取事务,提交事务,回滚事务。

  • TransactionDefinition

该对象封装事务详情(事务定义、事务属性),例如:隔离级别、是否只读、超时时间 等。

  • TransactionStatus

用于记录当前事务运行状态。例如:是否有保存点,事务是否完成。Spring底层根据状态进行相应操作。

4、事务案例SQL语句

CREATE TABLE user_account(id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50),money INT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;;
INSERT INTO user_account(username,money) VALUES('jack','5000');
INSERT INTO user_account(username,money) VALUES('tom','5000');
SELECT * FROM user_account ;

二、编程式事务管理

1、核心配置文件

<!-- 配置事物管理器 -->
<bean id="txManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" />
</bean>
<!-- 创建事物模板 -->
<bean id="transactionTemplate"class="org.springframework.transaction.support.TransactionTemplate"><property name="transactionManager" ref="txManager" />
</bean>
<!-- 配置转账接口 -->
<bean id="userAccountService"class="com.spring.mvc.service.impl.UserAccountServiceImpl"><property name="jdbcTemplate" ref="jdbcTemplate" /><property name="transactionTemplate" ref="transactionTemplate" />
</bean>

2、演示案例

@Service
public class UserAccountServiceImpl extends JdbcDaoSupport implements UserAccountService {// 注入事物模板private TransactionTemplate transactionTemplate ;public void setTransactionTemplate(TransactionTemplate transactionTemplate) {this.transactionTemplate = transactionTemplate;}@Overridepublic void remittance(String remitTer, String receiver, int money) {transactionTemplate.execute(new TransactionCallbackWithoutResult() {public void doInTransactionWithoutResult(TransactionStatus arg0) {outMoney(remitTer,money);// System.out.println(1/0);innerMoney(receiver,money);}});}private void outMoney (String remitTer, int money){String outSql = "update user_account set money = money - ? where username = ?";this.getJdbcTemplate().update(outSql, money ,remitTer);}private void innerMoney (String receiver, int money){String inSql = "update user_account set money = money + ? where username = ?";this.getJdbcTemplate().update(inSql, money,receiver);}
}

三、事务代理工厂

1、核心配置

<!-- 配置转账接口 -->
<bean id="userAccountService01"class="com.spring.mvc.service.impl.UserAccountServiceImpl01"><property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
<!-- 配置事务代理工厂 -->
<bean id="proxyAccountService"class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"><property name="proxyInterfaces" value="com.spring.mvc.service.UserAccountService01" /><property name="target" ref="userAccountService01" /><property name="transactionManager" ref="txManager" /><property name="transactionAttributes"><props><!-- 默认传播行为、隔离级别 --><prop key="remittance">PROPAGATION_REQUIRED,ISOLATION_DEFAULT</prop><!-- 异常仍然提交事务<prop key="remittance">PROPAGATION_REQUIRED,ISOLATION_DEFAULT,+java.lang.Exception</prop>--></props></property>
</bean>

配置说明:

  • proxyInterfaces 代理接口
  • target 代理目标类
  • transactionManager 事务管理器
  • transactionAttributes 事务属性(事务详情)
  • prop.key 指定方法使用当前事务配置

事务行为:

  • PROPAGATION 传播行为
  • ISOLATION 隔离级别
  • readOnly 是否只读
  • -Exception 异常回滚
  • +Exception 异常提交

2、演示案例

@Service
public class UserAccountServiceImpl01 extends JdbcDaoSupport implements UserAccountService01 {@Overridepublic void remittance(String remitTer, String receiver, int money) {outMoney(remitTer,money);System.out.println(1/0);innerMoney(receiver,money);}private void outMoney (String remitTer, int money){String outSql = "update user_account set money = money - ? where username = ?";this.getJdbcTemplate().update(outSql, money ,remitTer);}private void innerMoney (String receiver, int money){String inSql = "update user_account set money = money + ? where username = ?";this.getJdbcTemplate().update(inSql, money,receiver);}
}

3、测试代码

public class Tx_Test_02 {@Testpublic void test1 (){String xmlPath = "spring-jdbc-tx-02.xml";ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(xmlPath);UserAccountService01 accountService = (UserAccountService01)context.getBean("proxyAccountService");accountService.remittance("jack","tom",1000);}
}

四、XML配置事务

首先配置事务管理器,然后配置事务属性,最后基于AOP编程配置事务切入点。

1、核心配置

<!-- 配置事物管理器 -->
<bean id="txManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置转账接口 -->
<bean id="userAccountService01"class="com.spring.mvc.service.impl.UserAccountServiceImpl01"><property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
<!-- 配置事物详情 -->
<tx:advice id="txAdvice" transaction-manager="txManager"><tx:attributes><tx:method name="remittance"propagation="REQUIRED"isolation="DEFAULT"/></tx:attributes>
</tx:advice>
<!-- 事务切入点,基于AOP编程 -->
<aop:config><aop:advisoradvice-ref="txAdvice"pointcut="execution(* com.spring.mvc.service.UserAccountService01.*(..))"/>
</aop:config>

五、基于事务注解

配置事务管理器,并启动事务注解的支持,在目标类或目标方法添加@Transactional核心注解即可。

1、核心配置

<!-- 配置事物管理器 -->
<bean id="txManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" />
</bean>
<!-- 支持事务注解 -->
<tx:annotation-driven transaction-manager="txManager" />

2、注解用法

注解写在接口方法上,或者接口实现的方法上效果一样。

public interface UserAccountService02 {@Transactional(rollbackFor = Exception.class)void remittance(String remitTer, String receiver, int money) ;
}

六、源代码地址

GitHub·地址
https://github.com/cicadasmile/spring-mvc-parent
GitEE·地址
https://gitee.com/cicadasmile/spring-mvc-parent

Spring 框架基础(05):事务管理机制,和实现方式相关推荐

  1. Spring框架声明式事务管理

    Spring框架声明式事务管理 底层就是AOP原理,面向切面编程 在不修改源码的情况下,对方法进行增强 Spring框架事务管理相关类和API PlatformTransactionManager 平 ...

  2. data spring 指定时区_Spring 框架基础(05):Mvc架构模式,执行流程详解

    本文源码:GitHub || GitEE 一.SpringMvc框架简介 1.Mvc设计理念 MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里面, ...

  3. Spring入门5.事务管理机制

    Spring入门5.事务管理机制 20131126 代码下载 : 链接: http://pan.baidu.com/s/1kYc6c 密码: 233t 回顾之前的知识,Spring 最为核心的两个部分 ...

  4. Spring 事务管理机制概述

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

  5. 基于Spring中的事务管理机制

    什么是事务? 通俗理解,事务其实就是一系列指令的集合. 为什么要使用事务管理? 我们在实际业务场景中,经常会遇到数据频繁修改读取的问题.在同一时刻,不同的业务逻辑对同一个表数据进行修改,这种冲突很可能 ...

  6. Spring:事务管理的四大特性,事务管理机制

    1:认识事务 可以把一系列要执行的操作称为事务,而事务管理就是管理这些操作要么完全执行,要么完全不执行(很经典的一个例子是:A要给B转钱,首先A的钱减少了,但是突然的数据库断电了,导致无法给B加钱,然 ...

  7. 一.Spring框架基础

    JAVAEE框架之Spring 一.Spring框架基础 Spring:春天:轻量级的企业级开发框架,核心是IOC(控制反转)和AOP(面向切面编程). 官网:spring.io Spring–> ...

  8. Spring中进行事务管理的两种方式

    1.Spring中事务管理的API 事务是指逻辑上要么全部成功.要么全部失败的一组操作.例如用户A给用户B转账,则用户A账户余额减少.用户B账户增加这两个操作就是一组事务,必须全部成功或失败撤回操作, ...

  9. 全面分析 Spring 的编程式事务管理及声明式事务管理(转)

    摘要 Spring 的事务管理是 Spring 框架中一个比较重要的知识点,该知识点本身并不复杂,只是由于其比较灵活,导致初学者很难把握.本教程从基础知识开始,详细分析了 Spring 事务管理的使用 ...

最新文章

  1. centos7 中iptables、firewalld 、netfilter 关系
  2. 前端学习(2688):重读vue电商网站9之el-menu 默认会有一个 border-right
  3. Proxmark3 Easy Gui 4.0 5.0 5.1无限制版解密程序
  4. Eclipse 中 SVN 的设置。
  5. ORA-27125: unable to create shared memory segment
  6. 安卓代码获取系统属性值
  7. 免费计算机论文 阅读,计算机学术论文
  8. php 裁剪png图片,解决thinkphp裁剪png图片背景不透明的方法
  9. 源码下载地址及各类资源站点
  10. kubernetes 实用 api list
  11. c语言的字符数组strlen的详细使用
  12. 阿里云服务器ECS添加数据盘
  13. springboot单文件下载和多文件压缩zip下载
  14. 比菜鸟更进一步(1):Style文件和toolbar的使用
  15. 基于javaweb+jsp的个人日记管理系统(JavaWeb JSP MySQL Servlet SSM SpringBoot Layui Ajax)
  16. swift版QQ音乐播放器(二)
  17. Featured Domains
  18. 计算机联锁控制系统的软件应具备信号操作功能,车站信号计算机联锁控制系统—软件.ppt...
  19. Scheduling restart of crashed service
  20. 微信电脑端多开操作 要开多少台就有多少台(电脑小白都会)

热门文章

  1. redirect_uri 域名与后配置不一致是什么意思_免费 amp; 无限的域名/企业邮箱
  2. UVA216 ——dfs
  3. 51单片机之外部引脚及总线接口
  4. 数据结构之排序算法:并归排序
  5. (操作系统题目题型总结)第六章:文件管理
  6. 8-4:C++继承之子类的默认构造函数如何使用
  7. extundelete应用实战
  8. 零信任技术进阶篇(关键技术及挑战、BeyondCorp安全模型)
  9. QT5_chart_常见几种图形
  10. mgy最新地址 mgyuser.com