SpringBoot 开启事务很简单,只需要一个注解@Transactional
就可以了。因为在 SpringBoot 中已经默认对jpa、jdbc、mybatis 开启了事务,引入它们依赖的时候,事务就默认开启。当然,如果你需要用其他的 orm,比如 beatlsql,就需要自己配置相关的事物管理器。
注意:Spring Boot 2.0使用data Jpa时。创建表默认使用的是 MyISAM
引擎,MyISAM
引擎是不支持事务的。所以把数据库的表改为 InnoDB
引擎就行了。可以在 全局配置文件 中指定引擎
准备阶段
以第八篇文章的代码为例子,即 springboot 整合 mybatis ,第八篇文章是基于注解来实现 mybatis 的数据访问层,这篇文章基于 xml 的来实现,并开启声明式事务。
环境/版本一览:
- 开发工具:Intellij IDEA 2018.2.2
- springboot: 2.0.5.RELEASE
- jdk:1.8.0_171
- maven:3.3.9
1、pom.xml
1 | <dependencies> |
2、application.yml
1 | server: |
3、sql
1 | -- create table `account` |
4、resources
在 resources 下新建mapper 文件夹,在 mapper 下新建UserMapper.xml
1 |
|
5、entity
1 | package com.fatal.entity; |
6、mapper
AccountMapper接口
1 | package com.fatal.mapper; |
7、service
IAccountService
1 | package com.fatal.service; |
AccountServiceImpl
1 | package com.fatal.service.impl; |
8、Test
1 | package com.fatal.service.impl; |
@Transactional,声明事务,并设计一个转账方法,用户1减10块,用户2加10块。在用户1减10 ,之后,抛出异常,即用户2加10块钱不能执行,当加注解@Transactional之后,两个人的钱都没有增减。当不加@Transactional,用户1减了10,用户2没有增加,即没有操作用户2 的数据。可见@Transactional注解开启了事务。
笔记
2018/11/5
今天,是我测试 **@Async 异步事务**的第三天了。在这次测试中最大的收获就是解决了异步方法抛异常,事务方法和它调用的异步方法两个事务都回滚的问题。其中有个知识点很重要,就是 @Transactional 标注的方法中,如何手动回滚事务。
解决方法:一句即可 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); (一般手动回滚会放在 catch 代码块中来用。)
总结
SpringBoot 开启事务 很简单,只需要加一行注解就可以了,前提你用的是 jdbctemplate, jpa, mybatis,这种常见的orm。
SpringBoot
的知识已经有前辈在我们之前探索了。比较喜欢的博主有:唐亚峰 | Battcn、方志朋的专栏、程序猿DD、纯洁的微笑。对这门技术感兴趣的可以去他们的博客逛逛。谢谢他们的分享~~
以上文章是我用来学习的Demo
,都是基于 SpringBoot2.x
版本。
源码地址: https://github.com/ynfatal/springboot2-learning/tree/master/chapter11