当我尝试执行交易时..... 我的代码看起来像这样。
public class MyService {
private FirstDao firstDao;
private SecondDao secondDao;
private SomeotherDao someotherDao;
@Transactional
public void firstMethod() {
// performing some operation using firstDao
try {
secondMethod();
} catch (Exception e) {
// catching the exception
}
}
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void secondMethod() {
// performing some operation using secondDao
// some exception throws
}
@Transactional
public void someOtherMethod() {
// some other operation using someotherDao
}
}
AOP 是在Spring中执行交易的原因。对于每个操作(基于 propagation 级别),我认为它将创建一个合适的事务管理器,例如DataSourceTransactionManager
等,
在上面的代码中,当我尝试调用firstMethod
时,它是在同一bean中内部调用secondMethod
。如果secondMethod
引发了某些异常,则该异常不应反映或在提交firstMethod
时造成问题。但是,如果在secondMethod
中发生问题,我们也无法提交firstMethod
,因为它们共享相同的TransactionManager
。
我的理解是,通过将secondMethod
写在其他一些bean /类中可以解决此问题,因为两种方法都使用相同的TransactionManger
。
我不认为这是内部发生的事情。如果发生这种情况,则MyService类中的任何方法都会发生异常,其他所有方法也会失败。
有人可以解释一下生成代理时代码的样子。
这就是我的想法。
public class MyService {
PlatformTransactionManager platformTransactionManager;
private FirstDao firstDao;
private SecondDao secondDao;
private SomeotherDao someotherDao;
@Transactional
public void firstMethod() {
platformTransactionManager = new DataSourceTransactionManager();
// performing some operation using firstDao
try {
secondMethod();
} catch (Exception e) {
// catching the exception
}
// if no problem
platformTransactionManager.commit(status);
// else
platformTransactionManager.rollback(status);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void secondMethod() {
platformTransactionManager = new DataSourceTransactionManager();
// performing some operation using secondDao
// if no problem
platformTransactionManager.commit(status);
// else
platformTransactionManager.rollback(status);
}
@Transactional
public void someOtherMethod() {
platformTransactionManager = new DataSourceTransactionManager();
// performing some operation using someotherDao
// if no problem
platformTransactionManager.commit(status);
// else
platformTransactionManager.rollback(status);
}
}
如果以上情况为true
,则当secondMethod
抛出Exception
时,firstMethod
应该没有问题。但这没有发生。
因此,代理代码将如何显示,请给我一些想法。
注意:我可以通过在其他类中编写secondMethod来解决此问题,但想知道PlatformTransactionManager
在内部如何管理。
编辑:按照此@Transactional does not work on method level
当我们调用firstMethod
时,firstDAOProxy
将在我们正在调用secondMethod
的此方法内启动事务,secondDAOProxy
将启动事务。第二方法传播级别为REQUIRED_NEW,firstMethod
firstDAOProxy
应该没有问题,但这不是正在发生的情况。我的firstMethod
事务也失败了。