Spring事务有两种方式:编程式事务管理、声明式事务管理,下面我分别详解@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 IOC 和 Spring AOP,简化了应用程序使用数据库事务。
采用Spring 事务后,只需要 关注第3步的实现,其他的步骤 都是Spring 完成。
Spring 在启动的时候会根据 @Transactional的相关参数进行相关配置注入,这样就在代理中把相关的事务实现了:开启正常提交事务,异常回滚事务。
声明式事务本质是通过 Spring AOP 功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》