Java注解@Transactional事务类内调用不生效问题及解决办法_java

来源:脚本之家  责任编辑:小易  

首先来说注释有三种:/*/*/前两种编译器直接跳过,从来不阅读,第三种编译器是可以看懂的,当你使用javadoc这样的命令时会用到,用来生成API时用的。注解:这东东完全就是给编译器看的。比如@Ovrride表示这个方法是重写了父类中的方法,而不是自定义的,所以这个时候编译器会去检查你的方法名是否和父类一样,是否写错了。起初,注解是比较简单的,后来注解里面可以加入变量和参数,以节省代码(这些代码都是大家共同认可的,用一个公式给代替了)注解是对计算机的说明,也可以不用注解,自己写代码告诉计算机编译器。注解其实就是代码,只是看起来和我们自己写的有点不一样而已。也是代码的一部分,学习Hibernate和Spring等的时候会大量用到注解,用来节省大量代码www.zgxue.com防采集请勿采集本网。

@Transactional 内部调用例子 🌰

Java 注解全面解析,学习java做一个java工程师不但待遇高,而且前途无可限量。为什么这样说呢?因为java程序语言作为最流行的计算机开发语言之一,几乎所有的系统、软件、app、网页等都是需要用到java的。 1.基本语法 注解定义看起来很像接口的

在 Spring 的 AOP 代理下,只有目标方法由外部调用,目标方法才由 Spring 生成的代理对象来管理,这会造成自调用问题。

1、注解是针对Java编译器的说明。 可以给Java包、类型(类、接口、枚举)、构造器、方法、域、参数和局部变量进行注解。Java编译器可以根据指令来解释注解和放弃注解,或者将注解放到编译后的生成的class文件中,运行时可用。 2、注解和注解类型

若同一类中的其他没有@Transactional 注解的方法内部调用有@Transactional 注解的方法,有@Transactional 注解的方法的事务被忽略,不会发生回滚

Java注解相当于对类或者方法或者变量额外的注释(标识)。以下是转载 ------------------------------------------------------- Annotation是Java5、6只后的新特征(中文称之为注解),并且越来越多的得到了应用,比如Spring、Hibernate3、Stru

@Servicepublic class A{ public void action(){ dosome(); } @Transactional public void dosome(){ doa.insert(new Object()); }}

1、构造方法上加注解和普通方法加注解是一样的在构造方法定义前加 @注解类型就像行了。 public class Car { @Deprecated public Car() { } } 2、java语义规定注解类不能定义构造方法。可以使用default 关键字规定默认值,规定了默认值在使用时就

如上代码,在方法dosome()中抛出异常时,数据操作不会回滚

注释有 3 中基本类型a. 标记注释 -- 没有变量,只有名称标识。例如 @annotationb. 单一值注释 -- 在标记注释的基础上提供一段数据。如 @annotation(“data”)c. 完整注释 -- 可以包括多个数据成员,每个数据成员由名称和值构成。@annotation(val1=

解决方案

思路: 强制使用 AspectJ 对方法进行切面

Springboot 引入 AspectJ 切面

pom.xml 中添加AspectJ:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency><!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --><dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.5</version></dependency>

启动类中添加 @EnableAspectJAutoProxy(exposeProxy = true)

@SpringBootApplication@EnableAspectJAutoProxy(exposeProxy = true)public class DonngPartsApplication { public static void main(String[] args) { SpringApplication.run(DonngPartsApplication.class, args); }}

注意: exposeProxy = true 若不添加,则会报:

java.lang.IllegalStateException:

Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available,

and ensure that AopContext.currentProxy() is invoked in the same thread as the AOP invocation context.

代码中 ((A) AopContext.currentProxy()).dosome()

修改为如下代码,事务就生效啦

@Servicepublic class A{ public void action(){ ((A) AopContext.currentProxy()).dosome(); } @Transactional public void dosome(){ doa.insert(new Object()); }}

@Transactional 进阶

1. @Transactional 注解的属性信息

属性 描述
name 当在配置文件中有多个 TransactionManager , 可以用该属性指定选择哪个事务管理器
propagation 事务的传播行为,默认值为 REQUIRED
isolation 事务的隔离度,默认值采用 DEFAULT
timeout 事务的超时时间,默认值为-1。如果超过该时间限制但事务还没有完成,则自动回滚事务
read-only 指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true
rollback-for 用于指定能够触发事务回滚的异常类型,如果有多个异常类型需要指定,各类型之间可以通过逗号分隔
no-rollback- for 抛出 no-rollback-for 指定的异常类型,不回滚事务

2. propagation 传播行为 REQUIRED:如果有事务, 那么加入事务, 没有的话新建一个(默认情况下) NOT_SUPPORTED:容器不为这个方法开启事务 REQUIRES_NEW:不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务 MANDATORY:必须在一个已有的事务中执行,否则抛出异常 NEVER:必须在一个没有的事务中执行,否则抛出异常(与MANDATORY相反) SUPPORTS:如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务. NESTED: 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

3. 事物超时设置

@Transactional(timeout=30) //默认是30秒

4. 事务隔离级别 isolation READ_UNCOMMITTED:读取未提交数据(会出现脏读, 不可重复读) 基本不使用 READ_COMMITTED:读取已提交数据(会出现不可重复读和幻读) REPEATABLE_READ:可重复读(会出现幻读) SERIALIZABLE:串行化

注意

@Transactional 只能被应用到public方法上

仅仅 @Transactional 注解的出现不足于开启事务行为,它仅仅 是一种元数据

到此这篇关于Java注解@Transactional事务类内调用不生效问题及解决办法的文章就介绍到这了,更多相关Java注解@Transactional调用内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

属于重点,在系统中用到注解权限时非常有用,可以精确控制权限的粒度注意:要想使用反射去读取注解,必须将Retention的值选为Runtime Java代码import java.lang.annotation.Annotation;import java.lang.reflect.Method;读取注解信息public class ReadAnnotationInfoTest { public static void main(String[]args)throws Exception {/测试AnnotationTest类,得到此类的类对象 Class c=Class.forName(com.iwtxokhtd.annotation.AnnotationTest);获取该类所有声明的方法 Method[]methods=c.getDeclaredMethods();声明注解集合 Annotation[]annotations;遍历所有的方法得到各方法上面的注解信息 for(Method method:methods){/获取每个方法上面所声明的所有注解信息 annotations=method.getDeclaredAnnotations();再遍历所有的注解,打印其基本信息 System.out.println(method.getName());for(Annotation an:annotations){ System.out.println(方法名为:+method.getName()+其上面的注解为:+an.annotationType().getSimpleName());Method[]meths=an.annotationType().getDeclaredMethods();遍历每个注解的所有变量 for(Method meth:meths){ System.out.println(注解的变量名为:+meth.getName());} } } }}内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • spring @transactional注解失效解决方案
  • spring的@transactional注解用法解读
  • jvm指令的使用深入详解
  • 枚举java语言中的修饰符组合的实例代码
  • play for scala 实现sessionfilter 过滤未登录用户跳转到登录页面
  • springboot 部署到服务器上的方法
  • springboot使用spring-data-jpa实现crud操作
  • 带有@transactional和@async的循环依赖问题的解决
  • java基于calendar类输出指定年份和月份的日历代码实例
  • 详解spring中的javaconfig注解
  • 基于mybatis逆向工程的使用步骤详解
  • springcloud之feign示例详解
  • Java 注解的读取注解信息的方法
  • java中注释和注解于什么区别啊?
  • java注解的类型可以是哪些
  • java注解@immutable什么意思
  • java开发中常用的注解有哪些
  • Java 什么是注解及注解原理详细介绍
  • java 注解都有哪些东西?
  • java注解是怎么实现的
  • java里的注解都有哪些?都有什么用处啊?
  • JAVA就注解
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全c#教程vbvb.netc 语言java编程delphijavaandroidiosswiftscala易语言汇编语言其它相关首页spring @transactional注解失效解决方案spring的@transactional注解用法解读jvm指令的使用深入详解枚举java语言中的修饰符组合的实例代码play for scala 实现sessionfilter 过滤未登录用户跳转到登录页面springboot 部署到服务器上的方法springboot使用spring-data-jpa实现crud操作带有@transactional和@async的循环依赖问题的解决java基于calendar类输出指定年份和月份的日历代码实例详解spring中的javaconfig注解基于mybatis逆向工程的使用步骤详解springcloud之feign示例详解java使double保留两位小数的多方java8 十大新特性详解java.net.socketexception: connjava写入文件的几种方法分享java环境变量的设置方法(图文教程java 十六进制与字符串的转换java list用法示例详解java中file类的使用方法javaweb实现文件上传下载功能实例java 字符串截取的三种方法(推荐基于创建web项目运行时出错的解决方法(必携程apollo(阿波罗)安装部署以及java整java 中 阻塞队列blockingqueue详解及实例java泛型学习示例深入剖析java中的集合框架spring3 mvc请求参数获取的几种方法小结java 中堆内存和栈内存理解fastjson 常用api介绍及下载地址(推荐)springmvc和ajax如何实现前后端交互浅谈java引用和threadlocal的那些事
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved