springboot 数据库操作事务提交回滚实现不同方式

文章讨论了两种数据库事务管理方式:一种是使用@Transactional注解,但在@Test测试环境中可能无法正常工作;另一种是通过原生的数据库连接手动管理事务,包括开启、提交和回滚。示例代码展示了如何在出现异常时进行回滚操作,确保数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:使用@Transactional注解方式实现

*测试在@Test测试环境不可使用会直接回滚  原因暂未剖析

*该注解可直接表明在方法 类 接口上  不建议接口方式会失效

2:使用原生连接实现数据库事务管理  支持测试环境

@Test
    public void update() {
        Connection conn = null;
        Statement ps = null;
        Statement ps2 = null;

        String sql1 = "update user set last_name = 'sadggg' where id = 1";
        String sql2 = "update user set last_name = 'dfefgdsgnaskjfhjkf' where id = 2";

        try {
            conn = DBUtil.getConnection();
            conn.setAutoCommit(false);

            //编译第一条sql
            ps = conn.createStatement();
            ps.executeUpdate(sql1);
            //编译执行第二条sql这里可以使用插入一条异常语句或业务逻辑  我使用的是将sql超过列设置长度模拟执行失败
            ps2 = conn.createStatement();
            ps2.executeUpdate(sql2);

            conn.commit();
        } catch (Exception e) {
            e.printStackTrace();
            try {
                conn.rollback();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        } finally {
            try {
                conn.setAutoCommit(true);
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                DBUtil.closeResource(conn, ps);
            }
        }
        System.out.println("执行完毕");
    }

3:使用management  暂未实现后续补充其他方式

### Spring Boot 中 MongoDB 异步操作的事务回滚实现Spring Boot 应用程序中,当使用 MongoDB 进行异步操作并希望支持事务管理时,可以利用 `@Transactional` 注解以及 `TransactionTemplate` 来确保数据的一致性和可靠性。对于 MongoDB 的异步编程模型来说,可以通过以下方式来设置和处理事务。 为了使基于反应式的 MongoDB 客户端能够参与分布式事务,需要引入额外的支持库: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId> </dependency> <!-- 添加对响应式事务的支持 --> <dependency> <groupId>io.projectreactor.addons</groupId> <artifactId>reactor-extra</artifactId> </dependency> ``` 定义服务层方法时应用 `@Transactional` 注解,并通过 Mono 或 Flux 返回结果以适应非阻塞调用的需求[^1]。下面是一个简单的例子展示如何在一个异步环境中执行带有事务保护的操作序列: ```java @Service public class AsyncService { @Autowired private MongoOperations mongoOps; /** * 使用@Transactional注解开启事务控制 */ @Async @Transactional public CompletableFuture<Void> performComplexOperation() { try { // 执行一系列数据库更新动作... User user = new User(); user.setName("test"); // 插入新记录到集合users中 mongoOps.insert(user, "users"); // 故意抛出异常模拟失败场景以便观察回滚行为 throw new RuntimeException("Simulated failure after insertion."); } catch (Exception e) { log.error("Error occurred during complex operation", e); return CompletableFuture.failedFuture(e); } return CompletableFuture.completedFuture(null); } } ``` 需要注意的是,在实际开发过程中应当谨慎设计业务逻辑流程,确保所有可能引发错误的地方都被适当捕获并且不会破坏整个事务链路。此外,由于 MongoDB 自身并不完全支持传统意义上的 ACID 特性,因此建议开发者仔细评估应用场景后再决定是否采用此类方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PHP(Mr. Hamster)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值