Spring事务的超时时间
,以及Spring事务的传播属性
(是面试的关键所在),而在getTransaction()方法内部会返回有一个TransactionStatus接口实例,打开这个接口来观察一下 。.
public interface TransactionStatus extends TransactionExecution, SavepointManager, Flushable { boolean hasSavepoint(); // 是否存在hasSavepoint (事务保存点) void flush(); // 事务刷新}
而后该接口内部定义的时候又需要继承TransactionExecution、SavepointManager(事务保存点管理器)、Flushable(事务刷新)三个父接口 。下图就是Spring事务的整体架构 。

文章插图
3、编程式事务控制
由于现在很少用到这种编程式事务了,导致很多初学者根本不知道这其中是怎么配置的 。其实万变不离其宗,都是基于JDBC的事务控制 。3.1如何使用
- 使用步骤
- 配置事务-》 是数据源
- 编写代码 控制事务
数据源使用的是文章开始前的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 编写代码
@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);}}
注意:执行先,需要先将数据库表清空,能更好的观察执行结果 。
- 而后会发现,虽然我们的程序执行出现异常了,但数据库没有数据 。
经验总结扩展阅读
- 可爱在性感面前一文不值是什么意思?
- 一文带你读懂小米手环6和7的区别 小米手环7比6多了什么功能
- 教你搞定iPhone手机通话音量小的问题 苹果xr声音小怎么解决方法
- 一文看懂华为充电新技术 华为mate30支持无线充电吗
- 一键搞定OPPO手机微信支付的快速通道 oppo手机扫一扫在哪里
- 苹果如何录入nfc门禁卡 (一文了解iPhone手机添加门禁卡的方法)
- 教你一招搞定手机音量问题 苹果手机声音小怎么解决
- 搞定小米手机死机的方法 小米12pro屏幕死机怎么解决
- 千元搞定大内存高性能,别错过4款 一千左右性价比高的手机
- 一指禅搞定手机插入和调整单元格