SpringBoot中事务失效的场景(含示例代码)

news/2024/11/24 13:55:03/

在使用SpringBoot的开发过程中,我们有时候会遇到明明加了事务但是却不生效的场景,今天就稍微整理一下。

场景一:

方法未被声明为事务:在Spring Boot中,事务是基于注解或XML配置的方式进行声明的。如果一个方法没有被声明为事务,那么其中的数据库操作将不会受到事务管理的影响,可能导致数据不一致的问题。

public class UserService {private final UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository = userRepository;}// 事务未声明public void updateUserStatus(Long userId, boolean active) {userRepository.updateStatus(userId, active);}
}

在上述示例中,updateUserStatus方法没有被声明为事务,即使该方法中的数据库更新操作失败,也不会回滚,可能导致数据库中的数据和应用状态不一致。

场景二:

异常未被抛出:在默认情况下,Spring事务管理器只会在方法抛出RuntimeException及其子类的异常时回滚事务。如果方法抛出的是受检查异常或未抛出任何异常,事务将不会回滚。

@Service
@Transactional
public class OrderService {private final OrderRepository orderRepository;public OrderService(OrderRepository orderRepository) {this.orderRepository = orderRepository;}public void placeOrder(Order order) throws IOException {// 数据库更新操作orderRepository.save(order);// 受检查异常未被抛出try {sendNotification(order);} catch (IOException e) {// 异常被捕获,事务不会回滚}}private void sendNotification(Order order) throws IOException {// 发送通知throw new IOException("Failed to send notification");}
}

在上述示例中,placeOrder方法中的数据库更新操作将会执行,即使在sendNotification方法中抛出了异常。因为sendNotification方法中的异常被捕获了,并未向上抛出。

场景三:

方法不是公开的:在Spring事务管理中,默认情况下只会应用于公开方法。如果事务注解所标注的方法是私有、受保护或默认访问级别的,事务将无效。

 

@Service
public class UserService {private final UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository = userRepository;}// 私有方法,事务不会应用于该方法@Transactionalprivate void updateUserStatus(Long userId, boolean active) {userRepository.updateStatus(userId, active);}public void activateUser(Long userId) {updateUserStatus(userId, true);}
}

在上述示例中,updateUserStatus方法是私有的,虽然在activateUser方法中调用了它,但事务注解将不会应用于私有方法,导致事务失效。

这些是一些可能导致Spring Boot事务失效的常见场景和示例。在实际开发中,应注意事务的声明、异常的抛出和方法的可见性,以确保事务的正确应用和回滚。

 


http://www.ppmy.cn/news/384030.html

相关文章

锐龙r74800h和i710750h差距大吗 r74800h和i710750h对比

问起锐龙R7-4800H和酷睿i7-10750H,我觉得脱离了笔记本其他配件或者是笔记本用途,不太好单一去比较具体哪一个CPU更好。但是就目前我身边绝大部分朋友的需求来说,选择高端配置的用户,多数都是需要一台游戏本。 所以这里着重比较一下…

优思学院|质量管理六大思维陷阱【四】:抽样检查是最经济又能保证质量的方法吗?

在质量控制的过程中,一个常见的误解是认为抽样检查是最经济又能保证质量的方法。许多人认为进行百分之百的全数检查既浪费人力又时间不够。因此,他们倾向于采用抽样检查的方法,认为这样既符合经济成本,又能确保产品质量的水准。 …

一分钟了解物联存储柜的特点和功能

物联存储柜是一种智能存储柜,具有多种传感器和通信技术,集成物联网和云计算技术,通过自动化、智能化、网络化将传统存储柜与智能设备相结合,自动识别、存取物品,通过网络进行数据交互,实现远程监测和管理功…

MySQL查询优化大揭秘!看这些关键数据,让你的数据库速度飞起来!

大家好,我是小米,今天给大家分享一些关于MySQL查询优化的干货。在数据库开发和维护中,优化查询是至关重要的一环。通过合理的优化,我们可以让数据库的查询速度事半功倍。那么,在MySQL的查询计划中,有哪些关…

【饭谈】计算机专业刚毕业该何去何从?博主的亲身经历告诉你....

博主最近忙于在知乎上回答很多刚毕业大学生的问题,所以觉得关于入行确实应该好好聊一聊了。 其实博主和正在看文章的你一样,没什么背景,家庭条件在刚毕业时候可以说是极差,自己也没什么天赋,所以希望咱不要有距离感&a…

跟一位知名亿万富豪大佬聊天后,我的5点感悟!

点击“技术领导力”关注∆ 每天早上8:30推送 作者| Mr.K 整理| Emma 来源| 技术领导力(ID:jishulingdaoli) 上周末,老K受邀参加了金蝶的年度产品发布会。说实在话,参加技术大会对老K来说并不是新鲜事,这几年参与了数百场大大小…

阿里收购抖音?张一鸣不愿意卖,但可像微博一样拿钱

前几天,36kr音频做了一个话题,《如果阿里巴巴不惜一切收购抖音,张一鸣会答应吗?》,“罗超频道”作为嘉宾接受了语音采访,简单地谈了下自己观点,今天将其通过文章的形式分享出来。 抖音2018年的发…

H5传奇世界服务器架设技术及源码

以前是传奇迷,虽然现在不玩,但当作兴趣,研究了一下H5传奇世界的架设,架设成功并分享给大家。注意,此技术只可用于个人娱乐,不可用于商业用途。 首先下载 传奇世界H5源码 450M的样子。 H5传奇世界是用nodejs写的服务端,先安装系统必备中的nodejs, 然后安照视频教程进行…