PlatformTransactionManager如何在Spring Transaction中内部工作?

时间:2018-07-27 07:22:05

标签: java database spring spring-aop spring-transactions

当我尝试执行交易时..... 我的代码看起来像这样。

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

但是根据此线程Why are the transactions rolled back even when propagation=Propagation.REQUIRES_NEW in second method in Spring service class?

我的理解是,通过将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事务也失败了。

0 个答案:

没有答案