如何正确判断事务有无提交成功?

举报
bug菌 发表于 2024/12/31 10:05:11 2024/12/31
【摘要】 🏆本文收录于「滚雪球学SpringBoot」专栏,专业攻坚指数级提升持续更新中,up!up!up!!欢迎点赞&&收藏&&订阅。@TOC 前言在 Java 中,要判断事务是否提交成功,主要依赖事务的管理机制,比如 Spring 的事务管理 或 JDBC 的事务管理。以下是几种判断事务提交成功的方法: 1️⃣ Spring 声明式事务在 Spring 的声明式事务中,通过 @Transacti...

🏆本文收录于「滚雪球学SpringBoot」专栏,专业攻坚指数级提升持续更新中,up!up!up!!欢迎点赞&&收藏&&订阅。

@TOC

前言

在 Java 中,要判断事务是否提交成功,主要依赖事务的管理机制,比如 Spring 的事务管理JDBC 的事务管理。以下是几种判断事务提交成功的方法:


1️⃣ Spring 声明式事务

在 Spring 的声明式事务中,通过 @Transactional 注解管理事务,事务提交成功与否通常与代码逻辑和异常处理有关。

判断事务提交成功的方式

Spring 的事务会在方法执行完毕且未抛出任何异常时提交。如果方法抛出运行时异常,事务会回滚。

代码示例:

@Service
public class TransactionService {

    @Transactional
    public void performTransaction() {
        try {
            // 业务逻辑
            System.out.println("Performing transaction...");
            
            // 模拟逻辑,事务会提交
            if (true) {
                System.out.println("Transaction succeeded!");
            }

        } catch (Exception e) {
            // 捕获异常
            System.out.println("Transaction failed: " + e.getMessage());
            throw e; // 抛出异常,Spring 会回滚事务
        }
    }
}

说明:

  • 如果没有异常抛出,事务默认会提交。
  • 如果方法中抛出 RuntimeExceptionError,Spring 将回滚事务。

事务提交后确认

通过监听 Spring 的事务事件(TransactionSynchronization)可以判断事务是否提交成功。

实现方式:

import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.transaction.support.TransactionSynchronization;

public class TransactionListener {

    public void registerTransactionListener() {
        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
            @Override
            public void afterCompletion(int status) {
                if (status == TransactionSynchronization.STATUS_COMMITTED) {
                    System.out.println("Transaction committed successfully!");
                } else if (status == TransactionSynchronization.STATUS_ROLLED_BACK) {
                    System.out.println("Transaction rolled back!");
                }
            }
        });
    }
}

调用方式:

在业务逻辑中注册 TransactionListener,事务提交后会触发回调方法 afterCompletion


2️⃣ JDBC 手动管理事务

在使用 JDBC 直接管理事务时,可以通过捕获 commit() 方法的异常来判断事务是否提交成功。

代码示例:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JDBCTransactionExample {

    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/test";
        String username = "root";
        String password = "password";

        try (Connection connection = DriverManager.getConnection(url, username, password)) {
            // 关闭自动提交,开启事务
            connection.setAutoCommit(false);

            try {
                // 执行业务逻辑
                String sql = "INSERT INTO users (name, age) VALUES ('John', 30)";
                connection.prepareStatement(sql).executeUpdate();

                // 提交事务
                connection.commit();
                System.out.println("Transaction committed successfully!");

            } catch (Exception e) {
                // 回滚事务
                connection.rollback();
                System.out.println("Transaction rolled back due to error: " + e.getMessage());
            }

        } catch (SQLException e) {
            System.out.println("Database error: " + e.getMessage());
        }
    }
}

说明:

  • connection.commit() 成功执行即表示事务提交成功。
  • 如果 commit()rollback() 抛出异常,说明事务操作失败。

3️⃣ Hibernate 事务管理

在 Hibernate 中,事务由 Transaction 接口管理,通过 commit() 方法判断是否提交成功。

代码示例:

import org.hibernate.Session;
import org.hibernate.Transaction;

public class HibernateTransactionExample {

    public static void main(String[] args) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = null;

        try {
            // 开始事务
            transaction = session.beginTransaction();

            // 执行业务逻辑
            User user = new User("John", 30);
            session.save(user);

            // 提交事务
            transaction.commit();
            System.out.println("Transaction committed successfully!");

        } catch (Exception e) {
            if (transaction != null) {
                // 回滚事务
                transaction.rollback();
            }
            System.out.println("Transaction failed: " + e.getMessage());
        } finally {
            session.close();
        }
    }
}

说明:

  • transaction.commit() 成功执行表示事务提交成功。
  • 如果事务失败,可以捕获异常并回滚。

4️⃣ 日志分析事务状态

在实际项目中,可以通过以下方式确认事务提交成功:

  1. 检查数据库日志:确认事务是否成功持久化到数据库中。
  2. 启用 Spring 的事务日志:设置日志级别为 DEBUG,查看事务的提交或回滚日志。
    logging.level.org.springframework.transaction=DEBUG
    

日志输出示例:

DEBUG: Initiating transaction commit
DEBUG: Committing JDBC transaction on Connection
DEBUG: Transaction committed successfully

5️⃣ 实战场景中的事务提交判断

场景 1:事务中包含多个操作

如果事务中包含多个数据库操作,可以通过以下逻辑判断提交是否成功:

  • 查询数据库,确认所有数据是否已正确持久化。
  • 捕获 commit()@Transactional 方法的异常。

示例:

@Transactional
public void performComplexTransaction() {
    try {
        // 操作 1
        userRepository.save(new User("Alice", 25));
        // 操作 2
        orderRepository.save(new Order("Order123", 100));

        // 查询数据库验证操作是否成功
        if (checkDatabaseState()) {
            System.out.println("Transaction succeeded!");
        } else {
            throw new RuntimeException("Database state invalid");
        }

    } catch (Exception e) {
        // Spring 自动回滚
        System.out.println("Transaction failed: " + e.getMessage());
        throw e;
    }
}

总结

判断事务是否提交成功的方式主要取决于事务管理的方式:

  1. Spring 事务:

    • 默认情况下,只要 @Transactional 方法正常执行(无异常抛出),事务即提交。
    • 可通过监听事务事件或日志分析判断事务提交状态。
  2. JDBC 手动管理:

    • 使用 connection.commit(),通过捕获异常判断事务是否提交。
  3. Hibernate 事务:

    • 通过 Transaction.commit() 判断事务状态,捕获异常进行回滚。

最佳实践:

  • 在 Spring 环境中,推荐使用声明式事务(@Transactional)管理事务,简化代码逻辑。
  • 针对复杂场景,结合日志和数据库验证手段,确保事务提交状态。

通过以上方法,可以有效判断事务是否提交成功,并在事务失败时进行回滚处理,确保数据一致性! 🚀

🧧福利赠与你🧧

  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学SpringBoot」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门SpringBoot,就像滚雪球一样,越滚越大, 无边无际,指数级提升。

最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

✨️ Who am I?

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

-End-

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。