Spring事务管理详解(2种方式及原理机制)

Spring事务管理详解(2种方式及原理机制)-mikechen

Spring事务有两种方式:编程式事务管理、声明式事务管理,下面我分别详解@mikechen

Spring事务管理详解(2种方式及原理机制)-mikechen

编程式事务

所谓编程式事务指的是通过编码方式实现事务,允许用户在代码中精确定义事务的边界。

Spring框架提供了两种编程式事务方式:TransactionTemplate和PlatformTransactionManager。

Spring团队通常建议使用TransactionTemplate进行程序化事务管理。

TransactionTemplate采用与其他spring模板相同的方法,它使用一种回调方法,使应用程序代码可以处理获取和释放事务资源,让开发人员更加专注于业务逻辑。

如下所示:

@Autowired
private TransactionTemplate transactionTemplate;
public void testTransaction() {

        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {

                try {

                    // ....  业务代码
                } catch (Exception e){
                    //回滚
                    transactionStatus.setRollbackOnly();
                }

            }
        });
}

 

声明式事务

我们经常使用的 方式,通过Spring AOP 实现,对应用程序 侵入较少,采用注解的方式比较简单方便,省去XML 繁琐的配置。

其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

如下所示:

@Transaction
public void insert(String userName){
    this.jdbcTemplate.update("insert into t_user (name) values (?)", userName);
}

声明式事务最大的优点:就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码。

只需通过基于@Transactional注解的方式,便可以将事务规则应用到业务逻辑中,非常的方便高效。

 

Spring事务原理

Spring 本身并不实现事务,Spring事务的本质还是 底层数据库 对事务的支持,没有数据库事务的支持,Spring事务就不会生效。

对于纯 JDBC 操作数据库,想要用到事务,可以按照以下步骤进行:

1、获取连接 Connection con = DriverManager.getConnection()

2、开启事务con.setAutoCommit(true/false);

3、执行CRUD

4、提交事务/回滚事务 con.commit() / con.rollback();

5、关闭连接 conn.close();

Spring 事务提供一套抽象的事务管理,并且结合 Spring IOCSpring AOP,简化了应用程序使用数据库事务。

采用Spring 事务后,只需要 关注第3步的实现,其他的步骤 都是Spring 完成。

Spring 在启动的时候会根据 @Transactional的相关参数进行相关配置注入,这样就在代理中把相关的事务实现了:开启正常提交事务,异常回滚事务。

声明式事务本质是通过 Spring AOP 功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法