【发布时间】:2015-06-19 09:37:53
【问题描述】:
我正在尝试将我的 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 作为事务对象。但是,不幸的是,它是一个私有内部类,我无法使用它来获取状态。然后我尝试使用父类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 ?
}
}
}
【问题讨论】:
-
似乎过于复杂,使用
TransactionSynchronizationManager来注册您的回调,节省您调用此方法的时间,因为无论使用何种技术,您都会收到回调。 -
您是否只对 STATUS_MARKED_ROLLBACK 或其他值感兴趣?
-
@Marvin.. 到目前为止.. 我只需要 STATUS_MARKED_ROLLBACK 值。
标签: java spring hibernate transactions jta