Spring service中的方法互相调用问题

service中的方法互相调用问题

service的方法互相调用问题分为:

  1. 调用该service的方法
  2. 调用其他service的方法

一、调用该service的方法

  1. spring的事务管理使用AOP实现的
  2. AOP实现原理是递归调用所有加强方法,最后调用被代理对象的方法
  3. 如果调用该service对象的其他方法,其this对应的就是被代理对象,也就是没有加强方法,其配置的事务管理是不会开启的,只能依靠调用它的方法来开启事务。

二、调用其他service的方法

原理同上,但是该service对象应用的是其他service的加强对象,所以会有加强方法

新问题随之产生,如何保证嵌套的service业务方法只会提交一次。
这里建议看我的[完整文章],这里我就大致讲一下大致原理。

  1. Spring会用ThreadLocal<Map<DataSource, ConnectionHolder>>来保存Connection,
  2. 同时还用ThreadLocal<TransactionInfo> transactionHolder来保存当前事务
  3. 新建Connection的时候开启事务,会在TransactionInfo记录newTransaction为true,代表它是最外层的事务,只有该事务要提交,
  4. 如果是用从ThreadLocal里面取出的Connection来创建事务就在TransactionInfo记录newTransaction为false,代表该事务完成后不用提交。同时TransactionInfo里还用oldTransactionInfo来记录上一次TransactionInfo,形成链式栈,从而可以保证记录最外层的事务来实现事务的提交或回滚

这样就可以保证事务只被提交一次。

猜你喜欢

转载自blog.csdn.net/weixin_44815852/article/details/113885241