事务

首先,我们要知道事务是什么

构成单一逻辑工作单元的操作集合称为事务

事务的ACID特性

  • 原子性:不可分割的最小操作单位,要么同时成功,要么同时失败
  • 一致性:事务操作前后,数据总量不变
  • 隔离性:多个事务之间相互独立
  • 持久性:当事务提交或回滚后,数据会持久化的保存数据

传统编程的事务管理

在传统的JAVA数据库编程中,我们遵循的是打开连接-执行操作-提交事务-关闭连接,如下面的代码:

Connection con = getCon();con.setAutoCommit(false);con.prepareStatement("UPDATE...").execute();con.prepareStatement("UPDATE...").execute();con.commit();//conn.rollback();con.close();

这样就产生了很多模板代码,而且依靠程序员手动提交事务,也十分不可靠

Spring对事务的管理

Spring的事务管理分为两类

  • 声明式事务
  • 编程式事务

Spring定义了一个接口PlatformTransactionManager ,我们只需要使用其实现类,将数据源交其管理,即可实现Spring事务管理

@Configuration@EnableTransactionManagement // 开启事务管理@ComponentScan("wang.ismy.spring")public class Config { @Bean public DataSource dataSource(){ DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setUrl("jdbc:mysql:///test"); druidDataSource.setUsername("root"); druidDataSource.setPassword("123"); return druidDataSource; } @Bean public JdbcTemplate jdbcTemplate(DataSource dataSource){ return new JdbcTemplate(dataSource); } @Bean public PlatformTransactionManager transactionManager(DataSource dataSource){ return new DataSourceTransactionManager(dataSource); }}

这样,当你在你的service中抛出异常的时候,Spring就会自动帮你进行事务回滚

 @Transactional(rollbackFor = Exception.class) // Spring默认只对运行期异常回滚,加上该属性,则设置回滚的异常类型为Exception public void transfer() { jdbcTemplate.execute("UPDATE account SET amount = 90 WHERE name = 'alice'"); int a=1/0; jdbcTemplate.execute("UPDATE account SET amount = 110 WHERE name = 'bob'"); }

属性

@Transactional注解的一些属性说明如下

  • read-only:是否是只读事务。默认false,不只读。
  • isolation:指定事务的隔离级别。默认值是使用数据库的默认隔离级别。
  • propagation:指定事务的传播行为。
  • timeout:指定超时时间。默认值为:-1。永不超时。
  • rollback-for:用于指定一个异常,当执行产生该异常时,事务回滚。产生其他异常,事务不回滚。没有默认值,任何异常都回滚。
  • no-rollback-for:用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时,事务回滚。没有默认值,任何异常都回滚。

理解事务的传播行为

  • PROPAGATION_REQUIRED

简单来说就是两个被事务管理的方法都将在同一个事务内执行

  • PROPAGATION_REQUIRES_NEW

而这个传播行为则是开启一个新事务

  • PROPAGATION_NESTED

该传播行为则是与JDBC的保存点一样,它使用了物理事务的保存点的概念

编程式事务

一般来说,编程式事务很少用,它就是把一些对数据库的更新操作放在一起,来达到事务管理的目的

首先,我们需要一个

 @Bean public TransactionTemplate transactionTemplate(PlatformTransactionManager manager){ return new TransactionTemplate(manager); }

在使用的时候注入这个Template进行操作

 public void transfer(){ transactionTemplate.execute((TransactionCallback) status -> { String sql = "UPDATE account SET money = money -200 WHERE uid = 41"; String sql1 = "UPDATE account SET money = money +200 WHERE uid = 45"; jdbcTemplate.update(sql); jdbcTemplate.update(sql1); return null; }); }

这样,也能进行事务管理

原理

最后,来探讨一下Spring事务管理的原理

一句话,事务管理是通过AOP实现的,这个我们通过获取Bean的实际类型就知道

System.out.println(context.getBean(AccountService.class).getClass());// 结果:class wang.ismy.spring.AccountService$$EnhancerBySpringCGLIB$$f8bd6705

这是Spring官网给出的一个受事务管理的概念视图:

AOP增强了我们的Service类,当真实的方法被调用前与调用后,Spring替我们完成commit/rollback等操作,以实现事务管理

jdbctemplate 开启事务_Spring(四):事务管理相关推荐

  1. java jdbc开启事务_spring jdbc 事务配置

    配置WEB.XML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="h ...

  2. java中mvc事务_Spring MVC 事务配置

    Spring MVC事务配置 要了解事务配置的所有方法,请看一下<Spring事务配置的5种方法> 本文介绍两种配置方法: 以下所使用环境为Spring4.0.3.Hibernate4.3 ...

  3. jdbctemplate 开启事务_来,讲讲Spring事务有哪些坑?

    来自公众号:孤独烟 引言 今天,我们接上文<面试官:谈谈你对mysql事务的认识>的内容,来讲spring中和事务有关的考题! 因为事务这块,面试的出现几率很高.而大家工作中CRUD的比较 ...

  4. jdbctemplate 开启事务_SpringBoot 系列教程之事务隔离级别知识点小结

    上一篇博文介绍了声明式事务@Transactional的简单使用姿势,最文章的最后给出了这个注解的多个属性,本文将着重放在事务隔离级别的知识点上,并通过实例演示不同的事务隔离级别下,脏读.不可重复读. ...

  5. jdbctemplate 开启事务_浅入浅出 Spring 事务传播实现原理

    本文和大家一起刨析 Spring 事务的相关源码,篇幅较长,代码片段较多,建议使用电脑阅读 本文目标 理解Spring事务管理核心接口 理解Spring事务管理的核心逻辑 理解事务的传播类型及其实现原 ...

  6. MyBatisPlus 开启事务并交由 Springboot 管理

    MyBatisPlus 开启事务并交由 Springboot 管理 前言 一.什么是事务 二.开启方法 总结 前言 网络上对于事务的解释都太过官方,太过晦涩,导致我们都看不懂,我来用人话解释一下什么是 ...

  7. spring配置mysql事务管理_Spring 数据库事务管理机制

    要点1 Spring事务管理方法编程式事务(TransactionTemplate.PlatformTransactionManager) 声明式事务(配置式.注解式) 2 Spring 注解 @Tr ...

  8. 什么是事务、事务的四个特性ACID、不考虑隔离性会导致的三个问题、四种隔离级别

    什么是事务.事务的四个特性ACID.不考虑隔离性会导致的三个问题.四种隔离级别 1 什么是事务 2 事务的四大特性ACID 2.1 原子性 2.2 一致性 2.3 隔离性 2.4 持久性 3 不考虑隔 ...

  9. springboot 事务_Spring Boot中的事务是如何实现的?懂吗?

    一个SpringBoot问题就干趴下了?我却凭着这份PDF文档吊打面试官. 金三银四第一天,啃透这些SpringBoot知识点,还怕干不赢面试官? Spring全家桶笔记:Spring+Spring ...

最新文章

  1. Matlab学习笔记——数据文件定位
  2. python3 pyinstaller 打包后 程序会显示两个进程 解决方法
  3. python不能处理excel文件-别以为Python的pandas不能处理非规范Excel数据
  4. [转]学校的统一订书80%该烧掉——IT推荐书单
  5. JVM垃圾回收的时候如何确定垃圾?什么是GC Roots?
  6. big sur 降级_太阳报:若诺维奇降级,球员将降薪一半
  7. php 判断3个数谁最小,Python编程学习之如何判断3个数的大小
  8. java的Swing里怎么new一条线_java – 在JFrame上绘制一条线
  9. java学习(12):i++和++i的区别
  10. 顶级程序员的心得ndash;Coders at Work
  11. C# Winform 窗体美化(二、LayeredSkin 界面库)
  12. mysql 利用触发器(Trigger)让代码更简单
  13. SDL学习——画图、点阵显示
  14. java单链表删除重复元素_用加头节点实现链表的删除重复元素、分割、翻转(Java实现)...
  15. 关于Windows下使用CuteFTP向Ubuntu传文件时提示“请求被拒绝”
  16. FastSearch - 快速搜索包含指定内容的所有文件
  17. 新云人才招聘系统抖音小程序申请配置教程
  18. Doubly Linked List in Python
  19. 办公邮箱哪个比较好,企业电子邮箱官网在哪里?
  20. 逆元,欧拉降幂公式,二次剩余

热门文章

  1. 日志分析linux命令
  2. 直击中关村创业大街,新街头霸王来了
  3. 八皇后解法(回溯法)
  4. Web开发中需要注意的地方
  5. ios学习之UITabBar(标签栏)
  6. 智能客户端研究笔记(三)
  7. ffmpeg编解码详细过程
  8. 内核抢占,让世界变得更美好 | Linux 内核
  9. Linux一定需要文件系统吗?
  10. 微软笔试题(看到的写答案啊)