业务系统的数据,一般最后都会落入到数据库中,例如 MySQL、Oracle 等主流数据库,不可避免的,在数据更新时,有可能会遇到错误,这时需要将之前的数据更新操作撤回,避免错误数据。
Spring 的声明式事务能帮我们处理回滚操作,让我们不需要去关注数据库底层的事务操作,可以不用在出现异常情况下,在 try / catch / finaly 中手写回滚操作。
Spring 的事务保证程度比行业中其它技术(例如 TCC / 2PC / 3PC 等)稍弱一些,但使用 Spring 事务已经满足大部分场景,所以它的使用和配置规则也是值得学习的。
接下来一起学习 Spring 事务是如何使用以及实现原理吧。
使用例子
1.创建数据库表
![65b6ee75c74c3da2cc621c7d1a3f7a8a.png](https://i-blog.csdnimg.cn/blog_migrate/889661b44dc62e5dfe047c1c5be7cb2a.jpeg)
2.创建对应数据库表的 PO
![c25514edb77dbf340e7098f0473e889f.png](https://i-blog.csdnimg.cn/blog_migrate/8649bda2af64ea82aa23f930b2f740e4.jpeg)
3.创建表与实体间的映射
在使用 JdbcTemplate 时很纠结,在 Java 类中写了很多硬编码 SQL,与 MyBatis 使用方法不一样,为了示例简单,使用了 JdbcTemplate,不过还是建议朋友们用 MyBatis,让代码风格整洁。
![e1a5217277721ca6b50d1a35d68788c8.png](https://i-blog.csdnimg.cn/blog_migrate/9e159228f89bb7f3cc53264a57e67804.jpeg)
4.创建数据操作接口
![2e972da44065d7d9ee6369c037df3221.png](https://i-blog.csdnimg.cn/blog_migrate/3ab1b364c6e679ac01f931566067a63a.jpeg)
5.创建数据操作接口实现类
跟书中例子不一样,没有在接口上加入事务注解,而是在公共方法上进行添加,可以在每个方法上自定义传播事件、隔离级别。
![f8ea5d2d4ed8c3fe1387ec2b7e62bf7e.png](https://i-blog.csdnimg.cn/blog_migrate/e3c748c12da7ac262d386a0556bad48e.jpeg)
6.创建配置文件
<?xml version="1.0" encoding="UTF-8"?>
7.添加依赖
记得添加数据库连接和 jdbc、tx 这两个 spring 模块的依赖
optional(project(":spring-jdbc")) // for Quartz supportoptional(project(":spring-tx")) // for Quartz supportcompile group: 'mysql', name: 'mysql-connector-java', version: '5.1.6'
8.启动代码
public class TransactionBootstrap { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("transaction/transaction.xml"); UserJdbcTemplate jdbcTemplate = (UserJdbcTemplate) context.getBean("userJdbcTemplate"); System.out.println("--- Records Creation start ----"); JdbcUser user = new JdbcUser(4, "test