系列目录

spring事务详解(一)初探事务

spring事务详解(二)简单样例

spring事务详解(三)源码详解

spring事务详解(四)测试验证

spring事务详解(五)总结提高

一、引子

在Spring中,事务有两种实现方式:

  1. 编程式事务管理: 编程式事务管理使用底层源码可实现更细粒度的事务控制。spring推荐使用TransactionTemplate,典型的模板模式。
  2. 申明式事务管理: 添加@Transactional注解,并定义传播机制+回滚策略。基于Spring AOP实现,本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

二、简单样例

需求:

创建用户时,新建一个用户余额表。如果用户余额创建失败抛出异常,那么用户表也回滚,即要保证“新增用户+新增用户余额”一起成功 或 回滚。

2.1 申明式事务管理

如下图,只需要在service.impl层,业务方法上添加@Transactional注解,定义事务的传播机制为REQUIRED(不写这个参数,默认就是REQUIRED),遇到Exception异常就一起回滚。

REQUIRED传播机制下:存在加入事务,不存在创建新事务。保证了当前方法中的所有数据库操作都在一个物理事务中,当遇到异常时会整个业务方法一起回滚。

 /**
* 创建用户并创建账户余额
*
* @param name
* @param balance
* @return
*/
@Transactional(propagation= Propagation.REQUIRED, rollbackFor = Exception.class)
@Override
public void addUserBalanceAndUser(String name, BigDecimal balance) {
log.info("[addUserBalanceAndUser] begin!!!");
//1.新增用户
userService.addUser(name);
//2.新增用户余额
UserBalance userBalance = new UserBalance();
userBalance.setName(name);
userBalance.setBalance(new BigDecimal(1000));
this.addUserBalance(userBalance);
log.info("[addUserBalanceAndUser] end!!!");
}

2.2 编程式事务管理

编程式事务管理,我们使用Spring推荐的transactionTemplate。我这里因为使用的是spring cloud的注解配置,实现用了自动配置类配置好了TransactionTemplate这个类型的bean.使用的时候直接注入bean使用即可(当然老式的xml配置也是一样的)。如下:

 /**
* 创建用户并创建账户余额(手动事务,不带结果)
*
* @param name
* @param balance
* @return
*/
@Override
public void addUserBalanceAndUserWithinTT(String name, BigDecimal balance) {
//实现一个没有返回值的事务回调
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
try {
log.info("[addUserBalanceAndUser] begin!!!"); //1.新增用户
userService.addUser(name);
//2.新增用户余额
UserBalance userBalance = new UserBalance();
userBalance.setName(name);
userBalance.setBalance(new BigDecimal(1000));
userBalanceRepository.insert(userBalance);
log.info("[addUserBalanceAndUser] end!!!");
//注意:这里catch住异常后,设置setRollbackOnly,否则事务不会滚。当然如果不需要自行处理异常,就不要catch了
} catch (Exception e) {
// 异常回滚
status.setRollbackOnly();
log.error("异常回滚!,e={}",e);
} }
});
}

注意:

1.可以不用try catch,transactionTemplate.execute自己会捕捉异常并回滚。--》推荐

2.如果有业务异常需要特殊处理,记得:status.setRollbackOnly(); 标识为回滚。--》特殊情况才使用

三、总结

spring支持的这两种方式都可以,个人认为大部分情况下@Transactional可以满足需要。

spring事务详解(二)简单样例的更多相关文章

  1. spring事务详解(五)总结提高

    系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.概念 ...

  2. spring事务详解(四)测试验证

    系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...

  3. spring事务详解(三)源码详解

    系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...

  4. spring事务详解(一)初探事务

    系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 引子 很多 ...

  5. Spring AOP详解及简单应用

    Spring AOP详解   一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址: ...

  6. 死磕Spring之AOP篇 - Spring 事务详解

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

  7. Spring Aop 详解二

    这是Spring Aop的第二篇,案例代码很详解,可以查看https://gitee.com/haimama/java-study/tree/master/spring-aop-demo. 阅读前,建 ...

  8. spring事务详解(二)实例

    在Spring中,事务有两种实现方式: 编程式事务管理: 编程式事务管理使用底层源码可实现更细粒度的事务控制.spring推荐使用TransactionTemplate,典型的模板模式. 申明式事务管 ...

  9. CSS3 - 新单位vw、vh、vmin、vmax使用详解(附样例)

    像 px.em 这样的长度单位大家肯定都很熟悉,前者为绝对单位,后者为相对单位.CSS3 又引入了新单位:vw.vh.vmin.vmax.下面对它们做个详细介绍. 一.基本说明 1,vw.vh.vmi ...

随机推荐

  1. 保存eclipse个人配置的几种方式

    本人用eclipse做Java开发之前,往往要设置下eclipse的背景,字体,颜色,以便保护眼睛.但这些数据是放在workspaces里的,一旦新建workspace所有要重新调整,很麻烦,于是尝试 ...

  2. windows处理PHP定时任务

    我用的是bat文件处理定时任务,bat文件是可执行文件,由一系列命令构成,其中可以包含对其他程序的调用 创建一个bat文件,编辑文本,添加需要的php文件,前面路径是你的PHP执行程序,后面路径是文件 ...

  3. day 29 元类

    ---恢复内容开始--- 一.元类的介绍 元类:在python里,一切皆对象.所有自定义的类本身也是元类的对象,即所有自定义的类本质上也是由元类实例化出来的. class关键字创建自定义类的底层的工作 ...

  4. python模块之time_random

    把老师的资料放在最上面: 参考: http://www.cnblogs.com/yuanchenqi/articles/5732581.html 导入模块的方法: #!/usr/bin/env pyt ...

  5. js中bind的用法,及与call和apply的区别

    call和apply的使用和区别不再做阐述,可以参考我的另一篇随笔<JavaScript中call和apply方法的使用>(https://www.cnblogs.com/lcr-smg/ ...

  6. 在eclipse上集成安装阿里巴巴代码规约P3C插件

    在eclipse上集成安装阿里巴巴代码规约P3C插件 参照网址: https://jingyan.baidu.com/article/2d5afd6923e78b85a3e28e5e.html 首先进 ...

  7. Sharepoint 2016 配置FBA(四)添加用户到Membership数据库

    现在还不能用FBA登录,因为数据库还没有用户. 有一些方法来管理membership数据库,有可以用IIS来管理.推荐使用 SharePoint 2016 FBA Pack(https://share ...

  8. css解决多行溢出显示省略号

    多行溢出 仅作为记录方便查找 display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: number; /*n行溢 ...

  9. 从零开始写自己的PHP框架系列教程[前言]

    我觉得程序员进步的理由:多看->多写->多总结 我自我介绍下,我不是程序员,但是我爱编程,作为业余程序员自己写框架让人感到兴奋的,目前有很多框架(js有jQuery.Express.soc ...

  10. Flash Alternativa 3D引擎-基础理论

    自由行走的花 网站设计,flash网站设计与动画制作,web,as3 2010-12-31 14:29 [转]Flash Alternativa 3D引擎-基础理论 <本文转载自:http:// ...