你了解的Spring的Transactional注解控制事务,失效场景知多少?
1、数据库引擎不支持事务
这里以 MySQL 为例,其 MyISAM 引擎是不支持事务操作的,InnoDB 才是支持事务的引擎,一般要支持事务都会使用 InnoDB。
根据 MySQL 的官方文档:
https://dev.mysql.com/doc/refman/5.5/en/storage-engine-setting.html
从 MySQL 5.5.5 开始的默认存储引擎是:InnoDB,之前默认的都是:MyISAM,所以这点要值得注意,底层引擎不支持事务再怎么搞都是无济于事。2、数据源没有配置事务管理器
如下代码所示,当前数据源若没有配置事务管理器,那也是白搭!
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}3、没有被 Spring 管理// @Service public class UserServiceImpl implements UserService { @Transactional public void updateUser(User user) { // update user } }
如果此时把 @Service 注解注释掉,这个类就不会被加载成一个 Bean,那这个类就不会被 Spring 管理了,事务自然就失效了。4、方法不是 public 的
以下引自spring官方文档:
大致意思是:
@Transactional 只能用于 public 的方法上,否则事务会失效。如果要用在非 public 方法上,可以开启 AspectJ 代理模式。
5、自身调用问题
例1:@Service public class UserServiceImpl implements UserService { public void update(User user) { updateUser(user); } @Transactional public void updateUser(User user) { update user } }
例1 中,update方法上面没有加 @Transactional 注解,调用有 @Transactional 注解的 updateOrder 方法,updateOrder 方法上的事务管用吗?
例2:@Service public class UserServiceImpl implements UserService { @Transactional public void update(User user) { updateUser(user); } @Transactional(propagation = Propagation.REQUIRES_NEW) public void updateUser(User user) { update user } }
例2 中,update方法上面加了 @Transactional 注解,调用有 @Transactional 注解的 updateOrder 方法,updateOrder 方法上的事务管用吗?
很遗憾,这两个例子中, updateOrder 方法上的事务都不管用
因为它们发生了自身调用,就是调该类自己的方法,而没有经过 Spring 的代理类,默认只有在外部调用事务才会生效,这也是老生常谈的经典问题了。 6、异常被吃或异常类型错误
6.1这个也是出现比较多的场景:把异常吃了,然后又不抛出来,事务也不会回滚! @Service public class UserServiceImpl implements UserService { @Transactional public void updateUser(User user) { try { // update user } catch { } } }
6.2@Service public class UserServiceImpl implements UserService { @Transactional public void updateUser(User user) { try { // update user } catch { throw new Exception("更新异常"); } } }
这样事务也是不生效的,因为默认回滚的是:RuntimeException,如果你想触发其他异常的回滚,需要在注解上配置一下,如:
@Transactional(rollbackFor = Exception.class)
这个配置仅限于 Throwable 异常类及其子类。
7、@Transactional的扩展配置不支持事务
Propagation.NOT_SUPPORTED:表示不以事务运行,当前若存在事务则挂起。这表示不支持以事务的方式运行,所以即使事务生效也是白搭!
魅族究竟有什么魔力,叫人又爱又恨?自智能手机这个概念出世以来,这块市场就从来没有安静过,不断有新的品牌进入,稍有不慎便产生了出局者。前前后后10年,霸主从来没有被谁垄断过,前有苹果三星,后有小米OV华为。但就是在这
iPhoneSE3或将采用打孔屏设计,起价3499元,你会喜欢吗?就在去年,苹果终于在长达四年的时间里更新了iPhoneSE系列手机,第二代iPhoneSE2因其小巧的设计和强大的内部芯片,以及低廉的价格而成为人们的最爱。现在,苹果似乎加快了步伐
新基建读书摘要1新基建新红利新机遇2区块链是一个信息技术领域的术语。从本质上讲,它是一个共享数据库,存储于其中的数据或信息,具有不可伪造全程留痕可以追溯公开透明集体维护等特征。基于这些特征,区块
蓝色星球预言家,怎样进入未知的领域看着面前的队员和科学家们,刘明有些激动,还有几个小时就要进入黑行星了,人类对于黑行星有持续的研究,但今天将是第一次正式进入。我想听一听您们的看法刘明说道生物学家李力看了一下舰长回道
你从什么时候开始意识到中国正在逐渐变强?2000年以后我开始意识到中国真正逐渐变强了。我88年大学毕业后就在一家央企进出口公司工作负责非洲业务。去过非洲30多个国家。我亲身经历感觉到中国在非洲逐渐变强。2000年之前去非
宽带连接失败,错误为651怎么回事?出现错误代码651的原因有三种原因一ONUONT光MODEM报告错误。原因二如果是拨号连接,并且正在使用所支持的外置ONUONT光MODEM,请关闭并重新启动ONUONT光MODE
小米手机为什么不会被制裁?在制裁这件事上,如果某国制裁小米,限制小米的生产的话,那必然是害人害己!因为小米手机在芯片方面,在很多的配件方面都采购了某国的一些产品,如果说制裁了小米,可能很影响高通的营收,更加
顶级性能助听器效果最好吗?顶级机的的性能更优越,对声音的处理更好,可以提高聆听的舒适度。是的,清晰度很高,聆听效果更真实,各功能更加完善你好,不一定。影响佩戴效果的一些因素1听力损失程度1)听力损失程度往往
日本维克多公司VICTORPC100可拆卸盒式录音机产品简介制造厂商日本维克多公司(VICTOR品牌)产品型号VICTORPC100产品类型4波段收音机可拆卸盒式录音机可拆卸立体声音响生产日期1985年制造国家日本东京制造音响颜色红
年末捡漏老旗舰!三款12256骁龙888跌至3000元以内,你会买吗?年末又是捡漏老旗舰的好时机,因为新旧交替之际,手机厂商为了清库存会大幅下调老旗舰的价格,你现在看到的价格可能并非最终的最低价,也许再过一个月价格还会更低,不过现在以下三款12G25
中通快递员遭投诉当客户面踩碎包裹,快递就这样送货上门?来源人民网3日,一态度嚣张快递员冲上热搜近日,上海一快递员把宋女士的快递送错,却要宋女士丈夫自己去邻居家取,宋女士听到这种无理要求后投诉。第二天这名快递员上门送货,但却当着用户的面