- 使用步骤
- 配置事务-》 是数据源
- 编写代码 控制事务
数据源使用的是文章开始前的SpringJDBC的环境 地址1 配置事务
public class TransactionConfig {@Beanpublic PlatformTransactionManager transactionManager(DataSource dataSource) {// PlatformTransactionManager 类似于一个事务定义的标准// DataSource 也是一个标准 规范数据源DataSourceTransactionManager transactionManager =new DataSourceTransactionManager(dataSource);// transactionManager.setDataSource(dataSource); 二选一即可return transactionManager;}}
面试题: PlatformTransactionManager 与 TransactionManager两者区别?? TransactionManager是后爹 , 是属于PlatformTransactionManager父接口,但是现在不要轻易使用 , 因为很多的传统的Spring开发项目还是使用的是PlatformTransactionManager 。TransactionManager是为响应式编程做的准备 。2 编写代码【一文搞定 Spring事务】
@Testpublic void testInsert(){String sql = "insert into yootk.book(title,author,price) values(?,?,?)";LOGGER.info("【插入执行结果】:{}", jdbcTemplate.update(sql, "Python入门", "李老师", 99.90));LOGGER.info("【插入执行结果】:{}", jdbcTemplate.update(sql, "Java入门", null, 99.90));LOGGER.info("【插入执行结果】:{}", jdbcTemplate.update(sql, "Js入门", "李老师", null));}
文章插图
执行代码后会发现,出现异常提示信息 。由于我们的表中配置了not null , 所以在插入是会出现异常 。这也就是我们异常信息的来源 。
- 由于出现了异常 , 可是 , 数据还是插入到数据库,在正常开发中是不允许这样的情况发现的,那么该如何解决呢 。还记得上面配置的事务信息吗 。修改测试类如下:
文章插图
@Testpublic void testInsert() {String sql = "insert into yootk.book(title,author,price) values(?,?,?)";TransactionStatus status = transactionManager.getTransaction( //开启事务new DefaultTransactionAttribute()); // 默认事务属性try {LOGGER.info("【插入执行结果】:{}", jdbcTemplate.update(sql, "Python入门", "李老师", 99.90));LOGGER.info("【插入执行结果】:{}", jdbcTemplate.update(sql, "Java入门", null, 99.90));LOGGER.info("【插入执行结果】:{}", jdbcTemplate.update(sql, "Js入门", "李老师", null));transactionManager.commit(status); // 提交} catch (DataAccessException e) {transactionManager.rollback(status); // 回滚throw new RuntimeException(e);}}
注意:执行先,需要先将数据库表清空,能更好的观察执行结果 。
- 而后会发现,虽然我们的程序执行出现异常了,但数据库没有数据 。
- 说明我们配置的事务生效了,使其出现异常,回滚了 。
文章插图
3.2TransactionStatus
如果现在仅仅是使用了TransactionManager提交和回滚的处理方法,仅仅是Spring提供的事务处理的皮毛所在 , 而如果要想深入的理解事务处理的特点,那么就需要分析其每一个核心的组成类,首先分析的就是TransactionStatus 。
文章插图
在开启事务的时候会返回有一个TransactionStatus接口实例 , 而后在提交或回滚事务的时候都需要针对于指定的status实例进行处理,首先来打开这个接口的定义关联结构 。
文章插图
DefaultTransactionStatus是TransactionStatus默认实现的子类而后该类并不是直接实例化的,而是通过事务管理器负责实例化处理的 , status所得到的是一个事务的处理标记 , 而后Spring依照此标记管理事务 。
文章插图
现我们有以下业务,在业务执行过程中,有一部分业务执行失败,正常来说,是执行回滚操作 , 但是现在我们要让某一个位置之前的执行的sql不回滚 。那么这个功能如何实现呢?
这里就需要用到我们事务的保存点:
@Testpublic void testInsertSavePoint() { // 测试事务的保存点String sql = "insert into yootk.book(title,author,price) values(?,?,?)";TransactionStatus status = transactionManager.getTransaction( // 开启事务new DefaultTransactionAttribute()); // 默认事务属性Object savepointA = null; //保存点try {LOGGER.info("【插入执行结果】:{}", jdbcTemplate.update(sql, "Python入门", "李老师", 99.90));savepointA = status.createSavepoint(); // 创建保存点LOGGER.info("【插入执行结果】:{}", jdbcTemplate.update(sql, "Java入门", null, 99.90));transactionManager.commit(status); // 正常执行 事务提交} catch (DataAccessException e) {// 出现异常 先回滚到保存点 然后在提交保存点之前的事务status.releaseSavepoint(savepointA);// 回滚到保存点transactionManager.commit(status); // 提交throw new RuntimeException(e);}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 空调漏氟的原因有哪些 五招轻松搞定空调漏氟问题
- 蚂蚁花呗怎么还款 三步就可以搞定
- 千元换屏100块搞定 苹果xr换外屏玻璃多少钱
- 怎样鉴别真假蜂蜜,几个方法搞定 怎样鉴别真假蜂蜜
- 醉驾找什么关系可搞定 醉驾找关系的最佳时间是什么时候
- 怎么样换备胎视频教程 如何换备胎教你这九步轻松搞定
- 六点识别真假驾照 驾驶证怎么辨别真假?6个窍门,3秒搞定!
- 科三靠边停车30公分操作技巧,四步搞定 科目三靠边停车30公分一把过技巧
- 科目三靠边停车30cm技巧,简单5步就搞定 科目三靠边停车30cm技巧
- 酒驾找什么关系可搞定 驾驶员酒驾找关系可以摆平