首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >声明式事务和编程式事务的区别与使用

声明式事务和编程式事务的区别与使用

作者头像
用户1750537
发布2025-08-29 19:17:18
发布2025-08-29 19:17:18
9500
代码可运行
举报
运行总次数:0
代码可运行

在Java中,事务管理是确保数据一致性和完整性的重要手段。Spring框架提供了两种主要的事务管理方式:声明式事务编程式事务

1. 声明式事务

声明式事务是通过配置或注解的方式实现事务管理,开发者不需要手动编写事务管理代码。它基于AOP(面向切面编程)的思想,将事务管理逻辑与业务逻辑分离。

特点
  • 使用简单,代码侵入性低。
  • 适合大多数场景,尤其是需要对方法级别进行事务控制时。
  • 通过@Transactional注解实现。
使用场景

适用于大部分业务逻辑中,尤其是当事务逻辑与业务逻辑分离时。

代码实现
代码语言:javascript
代码运行次数:0
运行
复制
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    // 声明式事务,添加@Transactional注解
    @Transactional
    public void createUser(String username, String email) {
        // 插入用户信息到数据库
        String sql = "INSERT INTO users (username, email) VALUES (?, ?)";
        jdbcTemplate.update(sql, username, email);

        // 模拟一个异常,触发事务回滚
        if ("test".equals(username)) {
            throw new RuntimeException("模拟异常");
        }
    }
}
配置

在Spring配置文件中启用事务管理:

代码语言:javascript
代码运行次数:0
运行
复制
<tx:annotation-driven transaction-manager="transactionManager"/>

或者使用Java配置类:

代码语言:javascript
代码运行次数:0
运行
复制
@Configuration
@EnableTransactionManagement
public class AppConfig {
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

2. 编程式事务

编程式事务是通过手动编写代码来管理事务的开始、提交和回滚。这种方式灵活性更高,但代码侵入性强。

特点
  • 手动控制事务,灵活性高。
  • 代码耦合度较高,容易出错。
  • 适合需要动态控制事务的场景。
使用场景

适用于复杂的事务逻辑,例如需要根据条件动态决定是否开启事务。

代码实现
代码语言:javascript
代码运行次数:0
运行
复制
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;

@Service
public class UserService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Autowired
    private PlatformTransactionManager transactionManager;

    public void createUser(String username, String email) {
        // 定义事务属性
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

        // 开启事务
        TransactionStatus status = transactionManager.getTransaction(def);

        try {
            // 插入用户信息到数据库
            String sql = "INSERT INTO users (username, email) VALUES (?, ?)";
            jdbcTemplate.update(sql, username, email);

            // 模拟一个异常,触发事务回滚
            if ("test".equals(username)) {
                throw new RuntimeException("模拟异常");
            }

            // 提交事务
            transactionManager.commit(status);
        } catch (Exception e) {
            // 回滚事务
            transactionManager.rollback(status);
            throw e;
        }
    }
}

3. 对比总结

特性

声明式事务

编程式事务

实现方式

配置或注解

手动编码

代码侵入性

灵活性

较低

适用场景

简单事务逻辑

复杂事务逻辑

开发效率


4. 运行
  • 如果使用声明式事务,只需要在方法上添加@Transactional注解即可,Spring会自动管理事务。
  • 如果使用编程式事务,则需要手动控制事务的开始、提交和回滚。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 声明式事务
    • 特点
    • 使用场景
    • 代码实现
    • 配置
  • 2. 编程式事务
    • 特点
    • 使用场景
    • 代码实现
  • 3. 对比总结
  • 4. 运行
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档