Spring是一个基于Java平台的应用程序框架,既可以用于创建Java企业级应用程序,又可以作为IoC容器使用。Spring的一个重要特性就是支持事务管理。Spring事务管理比较灵活,并且提供了多种管理事务的方式。其中,手动提交事务也是比较常见的一种方式。
一、Spring手动提交事务的方法
Spring手动提交事务的方式一般分为以下三个步骤:
- 获取TransactionStatus对象
- 执行业务逻辑操作
- 手动提交或回滚事务
获取TransactionStatus对象可以通过TransactionTemplate类的execute()方法实现:
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); TransactionStatus status = transactionTemplate.getTransaction(null);
其中,transactionManager是一个DataSourceTransactionManager对象,用于管理事务。execute()方法的第一个参数是一个TransactionCallback
执行业务逻辑操作时,可以在TransactionCallback的doInTransaction()方法中实现:
transactionTemplate.execute(new TransactionCallbackWithoutResult() { protected void doInTransactionWithoutResult(TransactionStatus status) { //执行业务逻辑操作 } });
手动提交或回滚事务,则可以通过TransactionStatus对象的commit()和rollback()方法实现:
if (status.isCompleted()) { transactionTemplate.getTransactionManager().commit(status); } else { transactionTemplate.getTransactionManager().rollback(status); }
二、Spring手动提交事务未关闭
在使用Spring手动提交事务时,需要注意的一个问题是:如果手动提交事务后,是否还需要手动关闭事务?
答案是不需要。因为在使用Spring时,事务管理器会自动关闭事务,而且手动提交事务后,也不能再执行其他事务操作。
三、Spring注解手动提交事务
Spring还支持使用注解来控制事务的提交。使用注解进行事务控制比较简单,并且可以避免手动提交事务时出错的风险。
使用注解在方法中添加@Transactional注解即可:
@Transactional(rollbackFor = Exception.class) public void doInTransaction() { //执行业务逻辑操作 }
其中,rollbackFor用于设置事务回滚的条件,这里设置为Exception.class,表示当出现异常时进行回滚。
四、Spring手动回滚事务
在一些特殊情况下,需要手动回滚事务,比如出现了业务异常或其它不可预料的情况。在使用Spring手动提交事务时,同样也可以手动回滚事务。
在事务管理时,如果需要手动回滚事务,可以通过TransactionStatus对象的setRollbackOnly()方法设置:
status.setRollbackOnly();
设置setRollbackOnly()方法后,下一次提交事务时就会自动回滚事务。
五、Spring显示提交事务
在使用Spring进行事务管理时,事务默认是在方法执行结束后才进行提交。但是,在一些需要在方法执行中进行多次提交的场景下,就需要使用显示提交事务。
使用显示提交事务可以通过TransactionStatus对象的flush()方法实现:
status.flush();
调用flush()方法后,事务会立即提交,而不需要等到方法执行结束后再提交。
六、Spring会自动提交事务吗
在使用Spring进行事务管理时,事务默认是在方法执行结束后才进行提交。但是,这里的提交并不是指自动提交事务,而是指自动提交事务的一种方式。
其实,Spring默认不会自动提交事务。但是,在一些情况下,比如使用了JPA的保存操作(entityManager.persist())时,JPA会默认使用自动提交事务的方式,这种情况下需要注意。
七、Spring手动事务
Spring提供了多种事务管理方式,包括声明式事务和编程式事务。而使用Spring手动提交事务就是一种编程式事务管理方式。
使用Spring手动提交事务,可以手动控制事务的提交和回滚,灵活性较高,但也需要考虑到处理事务的正确性和风险。
八、SpringBoot事物提交
在使用SpringBoot开发应用时,同样也需要进行事务管理。比较常用的方式是在方法上添加@Transactional注解,声明式地管理事务。
使用@Transactional注解时,建议使用noRollbackFor属性来指定不需要回滚的异常:
@Transactional(noRollbackFor = {NullPointerException.class}) public void doInTransaction() { //执行业务逻辑操作 }
其中,noRollbackFor属性用于设置不需要回滚的异常,比如这里设置了NullPointerException.class,表示当遇到NullPointerException时不进行回滚。