我正在尝试将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 ?
}
}
}
解决方法:
Spring具有接收回调的机制.您可以实现TransactionSynchronization接口(或更容易地扩展TransactionSynchronizationAdapter).您可能想要实现afterCompletion(int)方法并将逻辑放在其中.
public class MyTxCallback extends TransactionSynchronizationAdapter {
public void afterCompletion(int status) {
if (status==STATUS_ROLLED_BACK) {
//logic here.
}
}
}
然后,您可以通过在事务启动时调用TransactionSynchronizationManager将其绑定到事务.现在,当事务完成时,将调用该方法,并且您可以执行自己的逻辑(无论使用何种基础事务资源).
标签:jta,hibernate,transactions,spring,java
来源: https://codeday.me/bug/20191120/2041645.html