在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解是不会生效的。
比如,下面代码例子中,有两方法,一个有@Transational注解,一个没有。如果调用了有注解的addPerson()方法,会启动一个Transaction;如果调用updatePersonByPhoneNo(),因为它内部调用了有注解的addPerson(),如果你以为系统也会为它启动一个Transaction,那就错了,实际上是没有的。
[java] view plain copy
  1. @Service
  2. public class PersonServiceImpl implements PersonService {
  3. @Autowired
  4. PersonDao personDao;
  5. @Override
  6. @Transactional
  7. public boolean addPerson(Person person) {
  8. boolean result = personDao.insertPerson(person)>0 ? true : false;
  9. return result;
  10. }
  11. @Override
  12. //@Transactional
  13. public boolean updatePersonByPhoneNo(Person person) {
  14. boolean result = personDao.updatePersonByPhoneNo(person)>0 ? true : false;
  15. addPerson(person); //测试同一个类中@Transactional是否起作用
  16. return result;
  17. }
  18. }
如何查看是否启动了Transaction?
设置log leve为debug,可以查看是否有下面这个log,判断是否启动了Transaction:
DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name...
同样地,@Async等其他注解也有这样的问题。
(关于@Async的用法,请参考:http://blog.csdn.net/clementad/article/details/47403185)
原因:
spring 在扫描bean的时候会扫描方法上是否包含@Transactional注解,如果包含,spring会为这个bean动态地生成一个子类(即代理类,proxy),代理类是继承原来那个bean的。此时,当这个有注解的方法被调用的时候,实际上是由代理类来调用的,代理类在调用之前就会启动transaction。然而,如果这个有注解的方法是被同一个类中的其他方法调用的,那么该方法的调用并没有通过代理类,而是直接通过原来的那个bean,所以就不会启动transaction,我们看到的现象就是@Transactional注解无效。
为什么一个方法a()调用同一个类中另外一个方法b()的时候,b()不是通过代理类来调用的呢?可以看下面的例子(为了简化,用伪代码表示):
[java] view plain copy
  1. @Service
  2. class A{
  3. @Transactinal
  4. method b(){...}
  5. method a(){    //标记1
  6. b();
  7. }
  8. }
  9. //Spring扫描注解后,创建了另外一个代理类,并为有注解的方法插入一个startTransaction()方法:
  10. class proxy$A{
  11. A objectA = new A();
  12. method b(){    //标记2
  13. startTransaction();
  14. objectA.b();
  15. }
  16. method a(){    //标记3
  17. objectA.a();    //由于a()没有注解,所以不会启动transaction,而是直接调用A的实例的a()方法
  18. }
  19. }

当我们调用A的bean的a()方法的时候,也是被proxy$A拦截,执行proxy$A.a()(标记3),然而,由以上代码可知,这时候它调用的是objectA.a(),也就是由原来的bean来调用a()方法了,所以代码跑到了“标记1”。由此可见,“标记2”并没有被执行到,所以startTransaction()方法也没有运行。

了解了失效的原因,解决的方法就简单了(两种):
  1. 把这两个方法分开到不同的类中;
  2. 把注解加到类名上面;
参考:
http://stackoverflow.com/questions/18590170/transactional-does-not-work-on-method-level
(原创文章,转载请注明转自:http://blog.csdn.net/clementad)

@Async,@Transational注解失效的原因和解决方法相关推荐

  1. 在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解失效的原因和解决方法

    在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解失效的原因和解决方法 参考文章: (1)在同一个类中,一个方法调用另外一个有注解(比如@Async, ...

  2. 使用注解失败的原因及解决方法

    启动项目报错: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with n ...

  3. js放到head中失效的原因与解决方法

    1.今天写js碰到一个奇怪的问题,写好的js放到body里面执行,但是放到head中没有任何效果,为什么导致这种原因呢? 看失效代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

  4. Ctrl+c失效问题原因、解决方法及相关拓展

    问题说明: 接手新业务,发现若干台主机(系统为Redhat 5.5)出现Ctrl+c失效情况,即进入一个持续的进程后(如top)无法使用Ctrl+c的方式退出该进程. 问题分析: Ctrl+c本质上是 ...

  5. Mysql中索引失效得原因和解决

    文章目录 前言 1.单个字段测试 varchar字段测试 name字段 name and status 测试 name and status and address 测试 2.最左前缀法则 复合索引测 ...

  6. SpringBoot 中@Autowired 注入失效原因及解决方法

    SpringBoot 中@Autowired 注入失效原因及解决方法 1.原因分析 1.1 包没有被扫描到通过@Autowired注入的类所在的包路径不在Application启动类所在的包/子包路径 ...

  7. 键盘的win键不能用怎么办 电脑win键失效的原因及解决办法

    电脑疑问  PConline IT百科 我们知道键盘的win键能快速打开开始菜单,配合其他键使用也能方便打开其他软件,可以让我们使用电脑更快捷,但是最近有的人发现自己电脑键盘的win键不能使用了,这是 ...

  8. 计算机音频和网络忽然失效,win7系统电脑突然没有声音五种原因及解决方法

    现在电脑已经是生活中必不可缺少的一部分,操作 win7系统 电脑过程中难免出现一些故障问题,这不有位用户说自己电脑运行过程中突然没有声音了,也不知道什么情况,针对win7系统电脑突然没有声音的问题,下 ...

  9. 常见的 OOM 原因及其解决方法(OutOfMemoryError)

    当 JVM 内存严重不足时,就会抛出 java.lang.OutOfMemoryError 错误.本文总结了常见的 OOM 原因及其解决方法,如下图所示.如有遗漏或错误,欢迎补充指正. 1.Java ...

最新文章

  1. Hadoop DFS源码研究之---Hadoop RPC机制
  2. Python中使用turtle绘制多个同心圆
  3. 最新最全的用户画像系统详解,还可免费试用哦!
  4. Device eth0 does not seem to be present,delaying initialization.
  5. 968. Binary Tree Cameras 监控二叉树
  6. 王道考研 计算机网络5 分层结构 协议 服务 接口
  7. [dp]最长单调递增子序列LIS
  8. array_keys_PHP array_keys()函数与示例
  9. python画折线图代码实现_python如何绘制分布折线图 python绘制分布折线图代码示例...
  10. WampServer + phpcms 开发中,浏览器 localhost 出现 Cannot to connect to mySQL server 的原因分析和解决办法?
  11. 华为eNSP Windows10安装教程及错误讲解
  12. 双稳态电路的两个稳定状态是什么_555定时器原理知多少?四种应用电路分享
  13. 十张数据图回顾雾霾,北京污染从南向北加深趋势明显
  14. SEO常用的数据名词解释
  15. 一毕业就上了艘“火箭”,这群校招生在大公司创业
  16. 实现蝴蝶翩翩飞舞的效果
  17. 【练习】第一个微信小程序
  18. 全球及中国散热产业竞争现状与市场价值分析报告2022版
  19. IDEA安装MAVEN
  20. 计算机视觉摔倒检测,有关摔倒检测数据集(fall detection databases)

热门文章

  1. AES地址栏传参加密
  2. java基础之-I/O流和File类解析
  3. 字符串匹配之KMP算法
  4. centos7 环境搭建(LNMP)以及虚拟环境(python3)
  5. ScrollView嵌套StackView提示需要宽度和高度限制
  6. 定义表格的指定列的属性
  7. 基于DPDK+VPP实现高性能防火墙
  8. (38)FPGA三种基本逻辑门(或门)
  9. linux改分区名字,修改分区的label
  10. 8006.ros2发布与订阅