⭐表示重要。

第一章:编程式事务

  • 事务功能的相关操作全部通过自己编写代码来实现。
  1. Connection conn = ...;
  2. try {
  3. // 开启事务:关闭事务的自动提交
  4. conn.setAutoCommit(false);
  5. // 核心操作
  6. // 提交事务
  7. conn.commit();
  8. }catch(Exception e){
  9. // 回滚事务
  10. conn.rollBack();
  11. }finally{
  12. // 释放数据库连接
  13. conn.close();
  14. }
  • 编程式事务的缺点:
  • ① 细节没有被屏蔽:具体操作过程中,所有细节都需要程序员自己来完成,比较繁琐。
  • ② 代码复用性不高:如果没有有效抽取出来,每次实现功能都需要自己编写代码,代码就没有得到复用。

第二章:声明式事务(⭐)

  • 既然事务控制的代码有规律可循,代码的结构基本是确定的,所以框架就可以将固定模式的代码抽取出来,进行相关的封装。
  • 封装起来后,我们只需要在配置文件中进行简单的配置即可完成操作:
    • ① 好处1:提高开发效率。
    • ② 好处2:消除了冗余的代码。
    • ③ 好处3:框架会综合考虑相关领域中在实际开发环境下有可能遇到的各种问题,进行了健壮性、性能等各个方面的优化。

总结:

  • 编程式:自己写代码实现功能。
  • 声明式:通过配置让框架实现功能。

第三章:事务管理器(⭐)

3.1 顶级接口

  • Spring 5.2 以前:
  1. public interface PlatformTransactionManager {
  2. TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
  3. void commit(TransactionStatus status) throws TransactionException;
  4. void rollback(TransactionStatus status) throws TransactionException;
  5. }
  • Spring 5.2 之后:
  1. public interface PlatformTransactionManager extends TransactionManager {
  2. TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException;
  3. void commit(TransactionStatus status) throws TransactionException;
  4. void rollback(TransactionStatus status) throws TransactionException;
  5. }

TransactionManager 接口中什么都没有,但是它还是有存在的意义——定义一个技术体系。

3.2 技术体系

事务管理器的技术体系.png

  • 我们现在使用的事务管理器是DatasourceTransactionManager ,将来整合 Mybatis 也是使用这个类。

  • DataSourceTransactionManager 类中的主要方法:

  • 开启事务:
  1. protected void doBegin(Object transaction, TransactionDefinition definition) {}
  • 挂起事务:
  1. protected Object doSuspend(Object transaction) {}
  • 恢复挂起的事务:
  1. protected void doResume(@Nullable Object transaction, Object suspendedResources) {}
  • 提交事务:
  1. protected void doCommit(DefaultTransactionStatus status) {}
  • 回滚事务:
  1. protected void doRollback(DefaultTransactionStatus status) {}