spring如何传递事务

不及物动词 其他 41

回复

共3条回复 我来回复
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Spring框架提供了多种方式来传递事务,以确保在跨多个方法或对象的多个事务边界中保持事务的一致性。下面是常见的几种传递事务的方式:

    1. REQUIRED:使用REQUIRED传递事务表示如果当前存在事务,则加入该事务,如果当前没有事务,则创建一个新的事务。这是默认的传递方式,适用于大多数情况。

    2. REQUIRES_NEW:使用REQUIRES_NEW传递事务表示每次都会创建一个新的事务,如果当前存在事务,则暂停当前事务,并创建一个新的事务。适用于需要独立事务的场景,例如,在更新某个数据时,需要保证原子性和隔离性。

    3. SUPPORTS:使用SUPPORTS传递事务表示如果当前存在事务,则加入该事务,如果当前没有事务,则以非事务方式执行。适用于不需要事务支持的操作。

    4. NOT_SUPPORTED:使用NOT_SUPPORTED传递事务表示不支持事务,如果当前存在事务,则暂停当前事务,并以非事务方式执行。适用于一些不需要事务的读操作。

    5. MANDATORY:使用MANDATORY传递事务表示必须存在一个事务,如果当前不存在事务,则抛出异常。适用于一些必须在事务中执行的操作,例如数据库写操作。

    6. NEVER:使用NEVER传递事务表示不允许存在事务,如果当前存在事务,则抛出异常。适用于一些禁止在事务中执行的操作,例如与外部系统的交互。

    在Spring中,可以通过在方法上使用@Transactional注解来定义事务的传递方式。例如:

    @Transactional(propagation = Propagation.REQUIRED)
    public void doSomething() {
    // 事务操作
    }

    需要注意的是,事务的传递方式只在方法调用之间起作用,不会跨越其他的Java对象或线程。因此,在跨越不同的对象或线程时,必须使用其他手段来确保事务的传递,例如使用消息队列或分布式事务管理器。

    总结:Spring提供了多种事务传递方式,可以根据业务需求选择合适的传递方式来保证事务的一致性。在方法上使用@Transactional注解来定义事务的传递方式,也可以通过其他手段来实现事务的跨越。

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Spring框架提供了多种方式来传递事务。下面是一些常用的传递事务的方式:

    1. Required传播行为(Propagation.REQUIRED):
      Required是默认的传播行为,它表示被调用方法必须在一个已存在的事务中运行,如果当前存在一个事务,那么该事务将被使用;如果当前没有事务,那么Spring将为该方法创建一个新的事务。

    2. RequiresNew传播行为(Propagation.REQUIRES_NEW):
      RequiresNew表示无论方法是否运行在一个事务中,被调用方法都将在一个新的事务中运行。如果当前存在一个事务,那么会将当前事务挂起,直到方法执行完毕后再继续执行当前事务;如果当前没有事务,则创建一个新的事务。

    3. Supports传播行为(Propagation.SUPPORTS):
      Supports表示被调用方法支持运行在一个事务中,如果当前存在一个事务,那么该方法将在该事务中运行;如果当前没有事务,那么该方法将以非事务的方式运行。

    4. Mandatory传播行为(Propagation.MANDATORY):
      Mandatory表示被调用方法必须运行在一个已存在的事务中,如果当前没有一个事务存在,那么将会抛出一个异常。

    5. NotSupported传播行为(Propagation.NOT_SUPPORTED):
      NotSupported表示被调用方法将以非事务的方式运行,如果当前存在一个事务,那么该事务将被挂起,直到方法执行完毕后再继续执行该事务。

    除了以上的传播行为方式外,Spring还提供了一些其他的传播行为,如:Nested(嵌套事务)、Never(不支持事务)、NestedReadOnly(嵌套只读事务)等。这些传播行为方式可以根据具体的业务需求来选择适合的传播方式,以实现对事务的灵活控制。

    1年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Spring 提供了多种方式来传递事务,包括编程式和声明式事务传递。下面将分别介绍这两种方式。

    一、编程式事务传递
    编程式事务传递是通过使用 TransactionTemplate 或 PlatformTransactionManager 接口来实现的。以下是实现步骤:

    1. 创建事务管理器 Bean
      首先,需要在 Spring 的配置文件中创建一个事务管理器的 Bean,可以是 DataSourceTransactionManager 或 JpaTransactionManager 等,具体根据项目中使用的持久层技术来选择。
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    
    1. 创建 TransactionTemplate Bean
      在 Spring 的配置文件中,创建一个 TransactionTemplate 的 Bean,并将事务管理器注入到 TransactionTemplate 中。
    <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
        <property name="transactionManager" ref="transactionManager" />
    </bean>
    
    1. 执行事务操作
      在代码中通过调用 TransactionTemplate 的 execute() 方法来执行需要进行事务管理的方法。在 execute() 方法中,可以通过编写业务逻辑来执行数据库操作,并通过编程方式来控制事务的提交或回滚。
    @Autowired
    private TransactionTemplate transactionTemplate;
    
    public void doSomethingInTransaction() {
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
             @Override
             protected void doInTransactionWithoutResult(TransactionStatus status) {
                 // 执行数据库操作
                 // 根据业务逻辑判断是否需要提交或回滚事务
                 if (condition) {
                     status.setRollbackOnly();
                 }
             }
        });
    }
    

    二、声明式事务传递
    声明式事务传递是通过使用 @Transactional 注解来实现的。以下是实现步骤:

    1. 开启注解驱动事务管理
      在 Spring 的配置文件中,需要添加以下代码来启用注解驱动事务管理。
    <tx:annotation-driven transaction-manager="transactionManager" />
    
    1. 定义事务管理器 Bean
      同样需要在 Spring 的配置文件中创建一个事务管理器的 Bean。
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    
    1. 声明事务
      在需要进行事务管理的方法上添加 @Transactional 注解。
    @Transactional
    public void doSomethingInTransaction() {
        // 执行数据库操作
        // 根据业务逻辑判断是否需要抛出异常来触发事务回滚
        if (condition) {
            throw new RuntimeException("Transaction rollback triggered.");
        }
    }
    

    声明式事务将根据方法的执行情况自动进行事务的提交或回滚,无需手动编写事务提交或回滚的代码。

    总结:
    Spring 提供了编程式和声明式两种方式来传递事务。编程式事务传递通过使用 TransactionTemplate 或 PlatformTransactionManager 接口来实现,可以通过编程方式来控制事务的提交或回滚。声明式事务传递通过使用 @Transactional 注解来实现,事务的提交或回滚将根据方法的执行情况自动进行。根据具体的需求和项目情况选择适合的事务传递方式。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部