Spring事务的使用

Spring事务的使用

基于注解(重要)

在Spring Boot中,@Transactional 注解用于声明式事务管理。它可以被放置在类或方法上,以便为特定的业务逻辑定义事务边界。以下是在Spring Boot项目中使用@Transactional注解的详细说明:

1. 启用事务支持

在Spring Boot应用中启用基于注解的事务管理,通常需要在配置类上添加 @EnableTransactionManagement 注解。在Spring Boot中,由于自动配置的存在,如果已经引入了如spring-boot-starter-data-jpa 或者 spring-boot-starter-data-jdbc等数据访问相关的起步依赖,且数据库连接池和事务管理器配置正确,那么事务管理会自动开启。

import org.springframework.transaction.annotation.EnableTransactionManagement;

@SpringBootApplication
@EnableTransactionManagement
public class Application {
    // ...
}

2. 使用@Transactional注解

a. 类级别注解

@Transactional 放置在类级别上意味着该类所有公共可见(非私有)的方法都将参与到事务中。不过需要注意的是,对于类内部调用,即同一个类内的方法互相调用时,事务可能不会生效,因为此时调用绕过了代理机制。

@Transactional
@Service
public class UserService {

    public void updateUser(User user) {
        // 这个方法会在一个事务中执行
    }

    // 其他业务方法...
}
b. 方法级别注解

更细粒度的控制可以通过在具体方法上添加 @Transactional 来实现。只有标注了此注解的方法才会在其执行过程中作为一个事务单元。

@Service
public class UserService {

    @Transactional
    public void updateUserInTx(User user) {
        // 这个方法将在一个事务中执行
        // 若其中发生异常,则整个事务将会回滚
    }
    
    // 未标注@Transactional的方法则不受事务控制
    public void nonTransactionalMethod() {
        // ...
    }
}
c. 注解属性
  • readOnly:设置为true时,指示事务只读,这样可能会获得更好的数据库性能优化。

    @Transactional(readOnly = true)
    public void findUsers() {
        // 只读操作,例如查询
    }
  • rollbackFornoRollbackFor:指定哪些异常会导致事务回滚,哪些不导致事务回滚。

    @Transactional(rollbackFor = Exception.class)
    public void updateWithExceptionHandling(User user) {
        // 如果在此方法中抛出Exception或其子类异常,事务将回滚
    }
  • propagation:定义事务的传播行为,例如是否新建事务、是否挂起当前事务等,前文已详述了七种不同的传播行为。

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void operationInNewTransaction() {
        // 新建一个独立于当前事务的新事务
    }

3. 注意事项

  • 代理机制@Transactional 的生效依赖于AOP代理,因此确保注解所在类由Spring容器管理,并且是通过代理方式调用的。如果直接通过new关键字创建对象实例并调用方法,事务是不会生效的。

  • 检查点:对于嵌套事务的支持(PROPAGATION_NESTED),需要数据库支持保存点(Savepoint)功能。

  • 私有方法与内部类:Spring AOP代理默认不会处理私有方法和静态方法上的事务注解,同样,内部类的方法也不会被代理处理,所以这些方法上的事务注解不会生效。

  • 事务隔离级别:可以通过 isolation 属性来指定事务的隔离级别,如 READ_COMMITTED、REPEATABLE_READ 等。

总之,在Spring Boot应用中使用@Transactional注解进行事务管理,能极大地简化事务控制代码,让开发者专注于业务逻辑实现,同时提供了灵活的方式来配置事务的行为。

基于XML(了解)

在Java开发中,XML配置和注解方式是两种常见的配置应用程序的方式,特别是在Spring框架中。以下是一份关于在Spring框架中XML配置与注解方式的用法对比示例:

XML配置方式

1. 定义Bean

<bean id="myService" class="com.example.MyServiceImpl">
    <!-- 配置依赖注入 -->
    <property name="dependency" ref="anotherBean"/>
</bean>

<bean id="anotherBean" class="com.example.AnotherBean"/>

这里通过<bean>标签定义了两个Bean,并通过<property>标签实现依赖注入。

2. 事务管理配置

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

<bean id="myTransactionalService" class="com.example.TransactionalService" />

<aop:config>
    <aop:pointcut id="serviceMethods" expression="execution(* com.example.TransactionalService.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/>
</aop:config>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED"/>
<-- 
<tx:method name=""/> 详情具体配置
                propagation 传播行为, REQUIRED:必须;REQUIRES_NEW:必须是新的
                isolation 隔离级别
    -->
    </tx:attributes>
</tx:advice>

这里使用了Spring的AOP以及事务相关的标签来配置事务管理器,并通过切点表达式指定哪些方法需要进行事务控制。

3. 自动装配

<context:component-scan base-package="com.example"/>

<context:annotation-config/>

启用组件扫描和自动装配注解,这样Spring会自动发现并处理类上的@Autowired@Component等注解。

原文链接 https://www.hanyuanhun.cn | https://node.hanyuanhun.cn

  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值