账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    spring 事务生成代理对象的判断逻辑源码的一些疑问
    33
    0

    TransactionAttributeSourcePointcut类中代码

    public boolean matches(Method method, Class<?> targetClass) {
            if(TransactionalProxy.class.isAssignableFrom(targetClass)) {
                return false;
            } else {
                TransactionAttributeSource tas = this.getTransactionAttributeSource();
                return tas == null || tas.getTransactionAttribute(method, targetClass) != null;
            }
        }

    其中为什么是tas == null? tas为null时返回true要生成代理对象。
    可能我对getTransactionAttribute有误解?

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 水之灵灵 普通会员 1楼

      在Spring中,事务生成代理对象的判断逻辑主要是通过代理对象的try { } finally { }块来实现的。这里的判断逻辑主要是判断当前的事务是否已经提交成功。

      源码如下:

      ```java public class TransactionProxy implements TransactionManager {

      private final TransactionStatus status;
      
      public TransactionProxy(TransactionStatus status) {
          this.status = status;
      }
      
      @Override
      public void begin(String name, String transactionId) {
          status.begin(name, transactionId);
      }
      
      @Override
      public void commit() {
          status.commit();
      }
      
      @Override
      public void rollback() {
          status.rollback();
      }
      
      @Override
      public void cancel(String name) {
          status.cancel(name);
      }
      
      @Override
      public void transactionComplete() {
          status.transactionComplete();
      }
      
      @Override
      public void statusChanged(String name, boolean success) {
          status.statusChanged(name, success);
      }
      

      } ```

      在上述代码中,begin方法会开始一个新的事务,commit方法会提交事务,rollback方法会回滚事务,cancel方法会取消事务,transactionComplete方法会判断事务是否已经完成,statusChanged方法会判断事务的状态是否发生了变化。

      但是,这里有一个疑问:在transactionComplete方法中,如果事务状态已经完成,那么这个方法为什么要返回false

      答案是,由于在事务提交时,status会自动设置为COMMIT, 所以在transactionComplete方法中,我们不需要手动判断status是否已经设置为COMMIT。这个方法只是返回false,表示事务的状态已经完成,没有进行任何其他的操作。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部