买星星网站源码分享?买星星官方网站

大家好,今天来为大家解答买星星网站源码分享这个问题的一些问题点,包括买星星官方网站也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~

此笔记仅分析@Transaction注解中的rollbackFor参数。

@Transaction注解中针对rollbackFor的参数定义为:

Class<?extendsThrowable>[]rollbackFor()default{};

也就是说,此参数只接受Throwable异常类或其子类,同时可以接受多个;那么在使用过程中通常使用的是@Transaction不带任何参数的裸写方式(使用默认参数),这时的rollbackFor参数的默认值是什么呢?

结论

Spring-tx默认只接受两种类型的异常,RuntimeException,Error。其它异常如果未指定rollbackFor参数的情况下是不会回滚的,比如Service接口抛出了一个Exception异常,那么写入DB的数据会正常写入,而不会回滚。

此分析基于Springframework5.1.7版本,

上面所说的三种异常类型具体是指两种默认的异常,即RuntimeException,Error,更多的异常需要在rollbackFor参数指定

解决方案

可以采用注解继承方式实现,例如:

importorg.springframework.transaction.annotation.Transactional;\n\nimportjava.lang.annotation.*;\n\n/**\n*@authorzhangql\n*扩展@Transaction注解,采用继承方式修改默认异常\n*/\n@Target({ElementType.METHOD,ElementType.TYPE})\n@Retention(RetentionPolicy.RUNTIME)\n@Transactional(rollbackFor=Exception.class)\n@Documented\npublic@interfaceXxxTransactional{\n}

其它方式待探索

源码分析

TransactionAspectSupport

1.1invokeWithinTransaction中调用业务方法

retVal=invocation.proceedWithInvocation();

1.2invokeWithinTransaction中cache代码块中调用回滚方法

completeTransactionAfterThrowing(txInfo,ex);

1.3completeTransactionAfterThrowing方法中,检查是否符合回滚条件。rollbackOn方法(重点在此)

if(txInfo.transactionAttribute!=null&&txInfo.transactionAttribute.rollbackOn(ex))

2.RuleBasedTransactionAttribute

中间通过委派对象调用到这里,委派部份代码跳过

2.1rollbackRules对象中装的内容为@Transaction注解中rollbackFor属性中定义的异常信息

if(this.rollbackRules!=null){\nfor(RollbackRuleAttributerule:this.rollbackRules){\n略…\n}\n}

2.2检查当前业务抛出的异常信息是否为RuneimtExceptoin如果是则返回0否则返回-1;跳转到4.

intdepth=rule.getDepth(ex);

2.3业务抛出的异常与指定的rollbackFor参数值或默认值(RuntimeException)不匹配时则不会设置winner(回滚规则属性)。

if(depth>=0&&depth<deepest){\ndeepest=depth;\nwinner=rule;\n}

2.4如果rollbackFor未指定时winner会为空,则直接进入检查对象类型

if(winner==null){\nlogger.trace(&34;);\nreturnsuper.rollbackOn(ex);\n}

3.DefaultTransactionAttribute

3.1从2.2调用后会跳转到这里。回滚未检查的异常RuntimeException,同时还兼容Error异常

@Override\npublicbooleanrollbackOn(Throwableex){\n\treturn(exinstanceofRuntimeException||exinstanceofError);\n}

RollbackRuleAttribute

4.1从2.1.1中调用过来,在检查时默认当前异常的深度为0,如果当前异常与默认RuntimeException匹配或在rollbackFor参数中指定的异常匹配,则返回0,否则取当前异常的父类来匹配指定的异常或默认的异常,直到匹配到Throwable异常类,当匹配到Throwable异常后,返回为-1

\t//RollbackRuleAttribute中定义的可接受的默认异常类\n\tpublicstaticfinalRollbackRuleAttributeROLLBACK_ON_RUNTIME_EXCEPTIONS=\n\t\t\tnewRollbackRuleAttribute(RuntimeException.class);\n\n\tpublicintgetDepth(Throwableex){\n\t\treturngetDepth(ex.getClass(),0);\n\t}\n\n\tprivateintgetDepth(Class<?>exceptionClass,intdepth){\n\t\tif(exceptionClass.getName().contains(this.exceptionName)){\n\t\t\t//Foundit!\n\t\t\treturndepth;\n\t\t}\n\t\t//Ifwe&39;tfoundit…\n\t\tif(exceptionClass==Throwable.class){\n\t\t\treturn-1;\n\t}\n\t\treturngetDepth(exceptionClass.getSuperclass(),depth+1);\n\t}

买星星网站源码分享的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于买星星官方网站、买星星网站源码分享的信息别忘了在本站进行查找哦。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平