在Java中,可以通过以下方式知道是否进行了事务回滚,主要取决于你使用的事务管理机制。例如,Spring框架和JDBC原生提供的事务管理。

1. 在Spring中检测回滚

Spring提供了事务管理器,可以通过监听或捕获相关事件来知道回滚是否执行。

方法 1: 使用 TransactionSynchronization 回调

Spring中的 TransactionSynchronization 接口可以监听事务的状态。

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

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

方法 2: 使用 @TransactionalTransactionAspectSupport

可以捕获异常并检查事务状态:

import org.springframework.transaction.interceptor.TransactionAspectSupport;

@Transactional
public void yourTransactionalMethod() {
    try {
        // 执行业务逻辑
    } catch (Exception e) {
        boolean isRollback = TransactionAspectSupport.currentTransactionStatus().isRollbackOnly();
        if (isRollback) {
            System.out.println("Transaction is marked for rollback.");
        }
        throw e;
    }
}

2. 在JDBC中检测回滚

如果使用原生的JDBC事务管理,可以通过 Connection 对象来检测事务回滚。

Connection connection = null;
try {
    connection = DriverManager.getConnection("jdbc:your-database-url");
    connection.setAutoCommit(false);

    // 执行业务逻辑

    connection.commit();
    System.out.println("Transaction committed.");
} catch (Exception e) {
    if (connection != null) {
        try {
            connection.rollback();
            System.out.println("Transaction rolled back.");
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
} finally {
    if (connection != null) {
        try {
            connection.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
}

3. 自定义回滚标记

在某些复杂业务场景中,你可能需要手动标记回滚状态。例如,通过自定义的标志位记录回滚信息:

public class TransactionService {
    private boolean rollbackFlag = false;

    @Transactional
    public void processTransaction() {
        try {
            // 执行业务逻辑
        } catch (Exception e) {
            rollbackFlag = true; // 标记为回滚
            throw e;
        }
    }

    public boolean isRolledBack() {
        return rollbackFlag;
    }
}

4. 监听事务事件

如果使用的是Spring事件机制,可以通过 ApplicationListener 监听事务相关的事件,例如 TransactionEvent

import org.springframework.context.ApplicationListener;
import org.springframework.transaction.event.TransactionalEventListener;

public class TransactionListener {

    @TransactionalEventListener
    public void handleTransactionEvent(SomeEvent event) {
        // 根据事件执行回滚逻辑
        System.out.println("Transaction event occurred.");
    }
}

以上方法可以帮助你检测事务回滚的执行,具体使用哪个取决于你的项目环境和技术栈。 3.webp