gpt4 book ai didi

java - 如何从 HibernateTransactionManager 获取事务状态

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:43:05 26 4
gpt4 key购买 nike

我正在尝试将我的 spring 事务管理器从 JtaTransactionManager 升级到 HibernateTransactionManager。在 JTA TransactionManager 中,我们有一种方法可以给出当前事务的状态。根据状态我们正在做一些操作。实现如下:

private void checkTransactionStatus(TransactionStatus status){
if(status instanceof DefaultTransactionStatus) {
DefaultTransactionStatus transactionStatus = (DefaultTransactionStatus) status;
if(transactionStatus.getTransaction() instanceof JtaTransactionObject){
JtaTransactionObject txObject = (JtaTransactionObject) transactionStatus.getTransaction();
int jtaStatus;
try {
jtaStatus = txObject.getUserTransaction().getStatus();
if(jtaStatus==Status.STATUS_MARKED_ROLLBACK){
// logic heare
}
} catch (SystemException e) {}
}
}
}

我想用 HibernateTransactionManager 特定代码替换此方法。我分析发现,HibernateTransactionManager使用的是HibernateTransactionObject作为事务对象。但是,不幸的是,它是一个私有(private)内部类,我不能用它来获取状态。然后我尝试使用父类JdbcTransactionObjectSupport。但是,我不知道如何从这个父类对象中获取状态。

private void checkTransactionStatus(TransactionStatus status){
if(status instanceof DefaultTransactionStatus) {
DefaultTransactionStatus transactionStatus = (DefaultTransactionStatus) status;
if(transactionStatus.getTransaction() instanceof JdbcTransactionObjectSupport){
JdbcTransactionObjectSupport txObject = (JdbcTransactionObjectSupport) transactionStatus.getTransaction();
//how to get the current status ?
}
}
}

最佳答案

Spring 有一个接收回调的机制。您可以实现 TransactionSynchronization接口(interface)(或更容易扩展 TransactionSynchronizationAdapter )。您可能想要实现 afterCompletion(int) 方法并将您的逻辑放入其中。

public class MyTxCallback extends TransactionSynchronizationAdapter {

public void afterCompletion(int status) {
if (status==STATUS_ROLLED_BACK) {
//logic here.
}
}

}

然后,您可以在事务启动时通过调用 TransactionSynchronizationManager 将其绑定(bind)到事务。现在,当交易完成时,将调用该方法,您可以执行您的逻辑(无论使用的底层交易资源如何)。

关于java - 如何从 HibernateTransactionManager 获取事务状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30934808/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com