首页天道酬勤Spring事务注解,如何实现Transactional注解

Spring事务注解,如何实现Transactional注解

张世龙 05-06 01:34 85次浏览

使用@Transactional需要注意以下几点:

缺省情况下,Spring回滚(RuntimeException )及其子类,遇到Exception及其子类时不执行回滚操作@Transactional注释仅适用于公共方法这需要配置由Spring AOP本质决定的@ transactional @ enabletransactionmanagement,但如果使用SpringBoot,则不需要:

@ springbootapplication @ enabletransactionmanagement /此注释已包含在TransactionAutoConfiguration自动配置类中。 publicclassspringtransactionalapplication { publicstaticvoidmain (字符串[ ] args ) spring ()。 }} TransactionAutoConfiguration自动配置类定义了许多与事务相关的bean,与@Transactional注释相关的是此类TransactionInterceptor。

将为每个具有@Transactional注释的方法创建一个片,所有事务逻辑都由该片完成。 此片的具体实现是TransactionInterceptor类。

请注意,此TransactionInterceptor是单个实例对象,所有具有@Transactional注释的方法都从此对象代理:

publicclasstransactioninterceptorextendstransactionaspectsupportimplementsmethodinterceptor, 序列化{//…@ override @ nullablepublicobjectinvoke (methodinvocationinvocation ) ThrowsThrowable )//workouthethetatable thetransactionattributesourceshouldbepassedthetargetclass//ASW ellas the target class=(invocation.getthis )!=null? AOP utils.gettargetclass (invocation.getthis () ) : null ); //adapttotransactionaspectsupport ' sinvokewithintransaction . returninvokewithintransaction (invocation.get method ), //. publicabstractclasstransactionaspectsupportimplementsbeanfactoryaware,initializing bean { @ nullableprotectedobjected finalinvocationcallbackinvocation (throws throwable (/……/其中TransactionAttributeSource对象是APP应用程序中所有方法上的@transacttion 其中//key由目标方法method对象目标类targetClass对象组成,因此, 可以在method targetClass中唯一地找到目标方法上的@Transactional注释属性信息transactionattributesourcetas=getesactional//此@Transactional 包含目标方法@Transactional注释的所有属性设置,如timeout、propagation和readOnly。 //然后使用这些属性完成相应的操作finaltransactionattribute=null? tas.gettransactionattribute (方法,目标类) : null );//…传输信息

txInfo = createTransactionIfNecessary(ptm, txAttr, joinpointIdentification);Object retVal;try {// 这里最终会调用到目标方法retVal = invocation.proceedWithInvocation();} catch (Throwable ex) {// 目标方法抛出了异常,根据@Transactional注解属性配置决定是否需要回滚事务completeTransactionAfterThrowing(txInfo, ex);throw ex;} // ...... // 目标方法正常执行完成,提交事务commitTransactionAfterReturning(txInfo);return retVal; }}

@Transactional注解属性含义:

value:可选的限定描述符,指定使用的事务管理器propagation:可选的事务传播行为设置isolation: 可选的事务隔离级别设置readOnly:读写或只读事务,默认读写timeout:事务超时时间设置rollbackFor:导致事务回滚的异常类数组rollbackForClassName:导致事务回滚的异常类名字数组oRollbackFor:不会导致事务回滚的异常类数组noRollbackForClassName:不会导致事务回滚的异常类名字数组

propagation各属性值含义:

Propagation.REQUIRED:如果有事务,那么加入事务,没有的话新创建一个Propagation.NOT_SUPPORTED:这个方法不开启事务Propagation.REQUIREDS_NEW:不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务Propagation.MANDATORY:必须在一个已有的事务中执行,否则抛出异常Propagation.NEVER:不能在一个事务中执行,就是当前必须没有事务,否则抛出异常Propagation.SUPPORTS:若当前存在事务,则在事务中运行.否则以非事务形式运行Propagation.NESTED:如果当前存在事务,则运行在一个嵌套的事务中,如果当前没有事务,则按照REQUIRED属性执行.它只对DataSourceTransactionManager事务管理器起效

关于Spring如何处理该属性参见AbstractPlatformTransactionManager类的getTransaction方法.

isolation各属性值含义:

TransactionDefinition.ISOLATION_DEFAULT:这是默认值,表示使用底层数据库的默认隔离级别.TransactionDefinition.ISOLATION_READ_UNCOMMITTED:该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据.该级别不能防止脏读,不可重复读和幻读,因此很少使用该隔离级别.比如PostreSQL实际上并没有此级别.TransactionDefinition.ISOLATION_READ_COMMITTED:该隔离级别表示一个事务只能读取另一个事务已经提交的数据.该级别可以防止脏读,这也是大多数情况下的推荐值.TransactionDefinition.ISOLATION_REPEATABLE_READ:该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同.该级别可以防止脏读和不可重复读.TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读.但是这将严重影响程序的性能,通常情况下也不会用到该级别.

 

 

 

 

 

springboot2测试类编写,java spring面试题