首页 > 其他分享 >spring事务控制

spring事务控制

时间:2023-08-26 10:22:05浏览次数:37  
标签:status 控制 事务 spring 回滚 方法 def transactionManager

spring事务回滚的两种方式

Spring事务回滚的前提是你当前使用的数据库必须支持事务,比如MySQL的Innodb是支持的,但Mysaim则是不支持事务的。
方法一
使用 @Transaction 来配置自动回滚,可以配置在类上,也可以配置在方法上(作用域不同),但对final或private修饰的方法无效,且该类必须是受spring所管控的,也就是被已经被注入的类,而不是new出来的类。

若配置在方法上,则该方法被加上了事务
若配置在类上,则等于给该类的所有方法都加上了该注解。此时如果在该类下的某个方法也加了 @Transaction ,则该方法使用自己的配置,其他方法使用类上的配置。
@Service
@Transactional
public class UserServiceImpl implements UserService {
    @Override
    public void save(User user) {
        //some code
        //db operation
    }
}
被配置的方法或类抛出了异常,则事务会被自动回滚,除非你在该方法中手动捕获了异常,且没有抛出新的异常。
可以使用 @Transactional(rollbackFor = Exception.class) 来设定针对特定的异常进行事务回滚,如果不设置则默认会回滚 RuntimeException and Error (参考自源码内文档)。
方法二
通过注入 DataSourceTransactionManager 来手动开启事务,手动回滚事务,用于抛出异常被catch后,进行手动回滚,可控程度更高,可以更灵活的使用。

1.先注入 DataSourceTransactionManager 事务管理对象
2.new 一个 DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 对象
3.使用 TransactionStatus status = transactionManager.getTransaction(def);来开启一个事务,
4.使用 transactionManager.rollback(status); 来回滚这个事务
5.使用 transactionManager.commit(status); 来提交这个事务
@Service
public class UserServiceImpl implements UserService {
   @Autowired
   private DataSourceTransactionManager transactionManager;
 
   @Override
   @Transactional
   public void save(User user) {
       DefaultTransactionDefinition def = new DefaultTransactionDefinition();
       // explicitly setting the transaction name is something that can only be done programmatically
       def.setName("SomeTxName");
       def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
 
       TransactionStatus status = transactionManager.getTransaction(def);
       try {
           // execute your business logic here
           //db operation
       } catch (Exception ex) {
           transactionManager.rollback(status);
           throw ex;
       }
   }
} // 此代码案例来自Alibaba Coding Guidelines

 

标签:status,控制,事务,spring,回滚,方法,def,transactionManager
From: https://www.cnblogs.com/wwwcf1982603555/p/17658435.html

相关文章

  • 【MySQL 8.0】密码复杂度验证组件与连接控制插件
    (root@node01)>installcomponent'file://component_validate_password';QueryOK,0rowsaffected(0.08sec)(root@node01)>select*frommysql.component;+--------------+--------------------+------------------------------------+|compo......
  • DCL-权限控制
      ......
  • Java流程控制switch选择结构
    swich选择结构多选择结构还有一个实现方式,就是swichcase语句swichcase语句判断一个变量与一个系列值中某个值是否相等,每个值称为一个分支swich语句中变量类型可以是byte、short、int、char,从Java7SE开始swich支持字符串String类型,同时case标签必须为字符串常量或者字面......
  • spring cache 学习——@CachePut 使用详解
    springcache学习——@CachePut使用详解 1.功能说明当需要在不影响方法执行的情况下更新缓存时,可以使用@CachePut,也就是说,被@CachePut注解的缓存方法总是会执行,而且会尝试将结果放入缓存(当然,是否真的会缓存还跟一些注解参数有关,比如:unless参数)。@CachePut跟@Ca......
  • SpringIOC、SpringMVC
    SpringIOCSpringIOC(InversionofControl,控制反转)是Spring框架的核心功能之一。它是一种设计模式,用于实现松耦合和可维护的应用程序。在传统的应用程序开发中,对象之间的依赖关系通常由对象自己创建和管理。这种方式导致了高度耦合和难以维护的代码。而SpringIoC通过将对象的......
  • spring cache 学习 —— @Cacheable 使用详解
    springcache学习——@Cacheable使用详解 1.功能说明@Cacheable注解在方法上,表示该方法的返回结果是可以缓存的。也就是说,该方法的返回结果会放在缓存中,以便于以后使用相同的参数调用该方法时,会返回缓存中的值,而不会实际执行该方法。注意,这里强调了一点:参数......
  • spring项目启动报错的处理
    自学spring,之前工程突然间无法启动,控制台有如下错误: ErrorstartingApplicationContext.Todisplaytheconditionsreportre-runyourapplicationwith'debug'enabled.2023-08-2521:24:26.473ERROR1303---[main]o.s.b.d.LoggingFailureAnalysisRepo......
  • Spring Boot 的约定优于配置
    3.首先,约定优于配置是一种软件设计的范式,它的核心思想是减少软件开发人员对于配置项的维护,从而让开发人员更加聚焦在业务逻辑上。4.SpringBoot就是约定优于配置这一理念下的产物,它类似于Spring框架下的一个脚手架,通过SpringBoot,我们可以快速开发基于Spring生态下的......
  • Spring事务源码原理详解(保姆级)
    ✅本文案例源码,基于最新SpringBoot版本2.7.5,Spring版本是5.3.23回顾SpringAOP⭐SpringAOP是Spring中除了依赖注入外(DI)最为核心的功能,AOP即为面向切面编程。⭐SpringAOP通过CGlib和JDK动态代理等方式来实现运行期动态方法增强,目的是将与业务无关的代码单独抽离......
  • 关于SpringBoot中出现的循环依赖问题
    环境:SpringBoot2.7.8背景:在增加出库订单时需要对物品表的的数量进行修改因此我在OutboundController中创建了几个公共方法,并将其注入到Spring中,结果给我报了这一串错误。Description:Thedependenciesofsomeofthebeansintheapplicationcontextfo......