Spring声明式事务

Spring 提供了声明式事务控制的方式,通过注解或 XML 配置来声明事务的边界。这样可以将事务管理与业务逻辑分离,使得代码更加清晰和易于维护。以下是使用注解方式进行声明式事务控制的示例:

  1. 配置事务管理器:首先需要配置事务管理器,用于管理事务的生命周期。

    java 复制代码
    @Configuration
    @EnableTransactionManagement
    public class AppConfig {
        @Bean
        public DataSource dataSource() {
            // 配置数据源
        }
    
        @Bean
        public PlatformTransactionManager transactionManager() {
            return new DataSourceTransactionManager(dataSource());
        }
    }
  2. 添加 @Transactional 注解:在需要事务管理的方法上添加 @Transactional 注解。

    java 复制代码
    @Service
    public class UserService {
        @Autowired
        private UserRepository userRepository;
    
        @Transactional
        public void createUser(User user) {
            userRepository.save(user);
        }
    
        @Transactional(readOnly = true)
        public User getUserById(Long id) {
            return userRepository.findById(id).orElse(null);
        }
    }

在上面的示例中,createUser 方法和 getUserById 方法都被声明为事务性方法。createUser 方法会开启一个读写事务,而 getUserById 方法则使用只读事务。

  1. 设置事务属性:@Transactional 注解支持设置多种事务属性,例如事务的隔离级别、超时时间、传播行为等。

    java 复制代码
    @Transactional(isolation = Isolation.READ_COMMITTED, timeout = 30, propagation = Propagation.REQUIRED)
    public void updateUser(User user) {
        userRepository.save(user);
    }

在这个示例中,updateUser 方法的事务隔离级别为 READ_COMMITTED,超时时间为 30 秒,传播行为为 REQUIRED。

  1. 异常处理:声明式事务控制还可以通过配置 @Transactional 注解来处理事务中的异常。

    java 复制代码
    @Transactional(rollbackFor = Exception.class)
    public void processOrder(Order order) throws Exception {
        // 业务逻辑
    }

在这个示例中,如果 processOrder 方法中抛出任何异常,事务将会回滚。

通过使用 @Transactional 注解,可以方便地在 Spring 中进行声明式事务管理,而无需手动编写事务管理相关的代码。

相关推荐
imuliuliang几秒前
Laravel8.x核心特性全解析
数据库
liann1192 分钟前
Agent 内存马禁止 Attach JVM
java·jvm·安全·网络安全·系统安全·网络攻击模型·信息与通信
lpfasd1236 分钟前
Win11笔记本睡眠唤醒致命bug:NUL设备丢失致Git等工具瘫痪
git·bug
战南诚7 分钟前
mysql的坑 - count计数
数据库·mysql
小雅痞7 分钟前
[Java][Leetcode middle] 36. 有效的数独
java·算法·leetcode
代码漫谈7 分钟前
JVM 参数调优:Spring Boot与JDK新特性的最佳结合
java·jvm·spring boot
卷毛的技术笔记11 分钟前
双十一零点扛过10倍流量洪峰:Sentinel与Redis+Lua的分布式限流深度避坑指南
java·redis·分布式·后端·系统架构·sentinel·lua
逻辑驱动的ken11 分钟前
Java高频面试考点场景题27
java·开发语言·面试·职场和发展·求职招聘
薪火铺子17 分钟前
MySQL 性能优化:慢查询与索引优化实战
数据库·mysql·性能优化
南境十里·墨染春水21 分钟前
C++ 日志 4—— 多线程安全与异步日志优化
数据库·c++·安全