@Transactional 注解详解

在 Java 中,事务管理可以通过多种方式实现,其中最常见的是使用 Spring 框架提供的事务注解。Spring 提供了 @Transactional 注解来简化事务管理。以下是关于 @Transactional 注解的详细解释和用法:
@Transactional 注解的基本用法
@Transactional 注解可以应用于类级别或方法级别,用于声明事务边界。
应用于类级别
当 @Transactional 注解应用于类级别时,该类中的所有公共方法都会被纳入事务管理

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class MyService {

    public void methodA() {
        // 事务管理的方法
    }

    public void methodB() {
        // 事务管理的方法
    }
}

 应用于方法级别
当 @Transactional 注解应用于方法级别时,只有被注解的方法会被纳入事务管理。

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class MyService {

    @Transactional
    public void methodA() {
        // 事务管理的方法
    }

    public void methodB() {
        // 非事务管理的方法
    }
}

@Transactional 注解的主要属性
@Transactional 注解提供了多个属性来控制事务的行为,以下是一些常用的属性:
propagation: 定义事务的传播行为,默认是 Propagation.REQUIRED。
REQUIRED: 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则挂起当前事务。
SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式继续运行。
NOT_SUPPORTED: 以非事务方式继续运行,如果当前存在事务,则挂起当前事务。
MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
NEVER: 以非事务方式继续运行,如果当前存在事务,则抛出异常。
NESTED: 如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则创建一个新的事务。
isolation: 定义事务的隔离级别,默认是 Isolation.DEFAULT。
DEFAULT: 使用底层数据库默认的隔离级别。
READ_UNCOMMITTED: 最低的隔离级别,允许读取尚未提交的数据变更。
READ_COMMITTED: 允许读取并发事务已经提交的数据。
REPEATABLE_READ: 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改。
SERIALIZABLE: 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰。
timeout: 定义事务的超时时间,单位是秒,默认值是 -1,表示没有超时限制。
readOnly: 指定事务是否为只读事务,默认值是 false。对于只读事务,数据库会进行优化。
rollbackFor: 定义哪些异常会导致事务回滚,默认情况下,运行时异常(RuntimeException)和错误(Error)会触发事务回滚。
noRollbackFor: 定义哪些异常不会导致事务回滚。
示例
以下是一个完整的示例,展示了如何使用 @Transactional 注解及其属性

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Transactional(
        propagation = Propagation.REQUIRED,
        isolation = Isolation.READ_COMMITTED,
        timeout = 30,
        readOnly = false,
        rollbackFor = {Exception.class},
        noRollbackFor = {NullPointerException.class}
    )
    public User createUser(User user) {
        // 执行业务逻辑
        userRepository.save(user);
        return user;
    }
}

注意事项

代理机制: Spring AOP 使用动态代理来实现事务管理。因此,@Transactional 注解的方法必须通过代理对象调用才能生效。直接在同一个类中调用 @Transactional 方法不会触发事务管理。
私有方法: @Transactional 注解不能应用于私有方法上,因为代理机制无法拦截私有方法。
异常处理: 默认情况下,未捕获的运行时异常(RuntimeException)和错误(Error)会触发事务回滚。如果需要回滚其他类型的异常,可以使用 rollbackFor 属性指定。
性能考虑: 尽量减小事务的范围,避免不必要的事务开销。

总结

@Transactional 注解是 Spring 框架中用于简化事务管理的强大工具。通过合理使用该注解及其属性,可以有效地管理和控制事务的行为,确保数据的一致性和完整性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值