@Transactional的失效场景和使用注意,单页web开发

本文介绍了Java中TransactionDefinition的事务传播模式,特别关注PROPAGATION_SUPPORTS、PROPAGATION_NOT_SUPPORTED和PROPAGATION_NEVER的区别。讨论了数据库引擎对事务的支持,以及@Transactional注解在处理事务生效和回滚中的陷阱,包括配置错误、异常处理和事务传播控制。最后提到一份前端开发者的学习资源集合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。

  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。

  • TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。

4、数据库引擎不支持事务

============

这种情况出现的概率并不高,事务能否生效的关键在于数据库引擎是否支持事务。

常用的MySQL数据库默认使用支持事务的innodb引擎。一旦数据库引擎切换成不支持事务的myisam,那事务就从根本上失效了。

三、@Transactional生效不回滚的场景

========================

@Transactional 底层原理是通过 AOP 实现事务处理的: 具体可以理解为,使用 try…catch…来包裹标记了 @Transactional 注解的方法,当方法出现了异常并且满足 一定条件 的时候,在 catch 里面我们可以设置事务回滚,没有异常则直接提交事务。

这里的“一定条件”,主要包括两点。

第一,只有异常传播出了标记了 @Transactional 注解的方法,事务才能回滚。 第二,默认情况下,出现 RuntimeException(非受检异常)或 Error 的时候,Spring 才会回滚事务。

@Transactional的失效场景和使用注意

由上述描述可知:有两种情况事务是不回滚的。

  • 异常无法传播出方法,导致事务无法回滚

  • 即使出了受检异常也无法让事务回滚

对应的解决方法有:

  • 1.如果你希望自己捕获异常进行处理的话,也没关系,可以手动设置让当前事务处于回滚状态:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

  • 2.如果希望 Spring 针对其他异常也可以回滚,那么可以相应配置 @Transactional 注解的 rollbackFor 和 noRollbackFor 属性来覆盖其默认设置。 例如:期望遇到所有的 Exception 都回滚事务(来突破默认不回滚 受检异常的限制):@Transactional(rollbackFor = Exception.class)

四、@Transactional使用防坑小结

======================

@Transactional使用上可能遇到的三类坑,包括:

  • 第一,因为配置不正确,导致方法上的事务没生效。

我们务必确认调用 @Transactional 注解标记的方法是 public 的,并且是通过 Spring 注入的 Bean 进行调用的。

  • 第二,因为异常处理不正确,导致事务虽然生效但出现异常时没回滚。

Spring 默认只会对标记 @Transactional 注解的方法出现了 RuntimeException 和 Error 的时候回滚,如果我们的方法捕获了异常,那么需要通过手动编码处理事务回滚。
如果希望 Spring 针对其他异常也可以回滚,那么可以相应配置 @Transactional 注解的 rollbackFor 和 noRollbackFor 属性来覆盖其默认设置。

  • 第三,如果方法涉及多次数据库操作,并希望将它们作为独立的事务进行提交或回滚。
    那么我们需要考虑进一步细化配置 事务传播方式,也就是 @Transactional 注解的 Propagation 属性。

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
img

学习笔记、源码讲义、实战项目、讲解视频**

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
[外链图片转存中…(img-Yup0oBgN-1710868620434)]

<think>好的,我现在需要帮助用户在Ubuntu 22.04上安装CUDA 12.4。让我先整理一下已知的信息可能的步骤。 首先,用户提到了引用中的内容,特别是引用[2]中的安装步骤,包括使用wget下载安装脚本,然后用sudo运行。同时,引用[3]提到了如果出现“nvcc not found”的错误,需要手动添加路径。这说明安装过程中可能会遇到环境变量配置的问题。 接下来,我需要确保用户满足安装CUDA 12.4的系统要求。根据引用[1],用户使用的是Ubuntu 22.04,内核版本6.5.0-35-generic,这应该符合CUDA 12.4的要求。不过,用户需要确认他们的系统是否已经安装了兼容的NVIDIA驱动程序。通常,CUDA安装包会包含驱动程序,但有时候可能需要单独安装,特别是如果用户希望使用特定版本的驱动。 然后,用户需要下载正确的CUDA安装包。根据引用[2],他们需要使用wget获取cuda_12.4.1_550.54.15_linux.run这个文件。但需要注意,官网可能有更新的版本或不同的文件名,所以最好检查NVIDIA官方网站确认下载链接是否正确。 安装过程中,用户需要以超级用户权限运行脚本,即使用sudo sh命令。安装时可能会遇到交互式界面,需要用户选择安装选项,比如是否安装驱动程序、工具包等。这里需要指导用户正确选择组件,避免安装不必要的部分或遗漏关键组件。 安装完成后,配置环境变量是关键的一步。引用[3]提到如果nvcc不可用,需要手动添加路径。通常,CUDA的安装路径是/usr/local/cuda-12.4,所以需要将binlib64目录添加到PATHLD_LIBRARY_PATH环境变量中。用户可能需要编辑.bashrc或.profile文件,并应用更改。 验证安装是否成功,用户需要运行nvcc --versionnvidia-smi,这两个命令分别检查CUDA工具链驱动是否正确安装。如果nvcc未找到,可能需要重新检查环境变量设置,或者确认安装时是否选择了安装工具包组件。 另外,用户可能会遇到依赖项的问题,比如缺少必要的库文件。这时候需要指导用户安装这些依赖,例如通过apt install来安装。 最后,提醒用户参考官方文档,因为不同版本的CUDA可能有细微的安装差异,或者有已知的问题解决方法。同时,如果用户之前安装了其他版本的CUDA,可能需要处理多版本共存的问题,比如使用符号链接或调整环境变量来切换版本。 总结下来,步骤大致是:检查系统兼容性,下载安装包,运行安装脚本,配置环境变量,验证安装,处理可能的错误。需要确保每一步都清晰,并且考虑到可能出现的常见问题,如路径配置错误或依赖缺失。</think>以下是在Ubuntu 22.04上安装CUDA 12.4的详细步骤: ### 一、系统环境准备 1. **确认系统版本** 终端执行: ```bash lsb_release -a ``` 输出需包含`Ubuntu 22.04`[^1]。 2. **更新软件源** ```bash sudo apt update && sudo apt upgrade -y ``` 3. **安装编译依赖** ```bash sudo apt install build-essential linux-headers-$(uname -r) ``` ### 二、下载CUDA安装包 1. **获取官方安装脚本** ```bash wget https://developer.download.nvidia.com/compute/cuda/12.4.1/local_installers/cuda_12.4.1_550.54.15_linux.run ``` 该链接来自NVIDIA开发者网站[^2]。 ### 三、安装CUDA 1. **赋予执行权限** ```bash chmod +x cuda_12.4.1_550.54.15_linux.run ``` 2. **运行安装程序** ```bash sudo ./cuda_12.4.1_550.54.15_linux.run ``` - 按空格键阅读协议,输入`accept`确认 - **取消勾选`Driver`**(若已安装NVIDIA驱动) - 确保勾选`CUDA Toolkit 12.4` ### 四、配置环境变量 1. **编辑bash配置文件** ```bash echo 'export PATH=/usr/local/cuda-12.4/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/usr/local/cuda-12.4/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc ``` 2. **验证路径配置** ```bash which nvcc # 应输出/usr/local/cuda-12.4/bin/nvcc ``` ### 五、验证安装 1. **检查CUDA版本** ```bash nvcc --version # 应显示12.4版本 ``` 2. **查看GPU状态** ```bash nvidia-smi # 显示GPU信息与CUDA版本 ``` ### 六、常见问题处理 - **报错`Command 'nvcc' not found`** 执行以下命令后重新配置环境变量: ```bash sudo apt install nvidia-cuda-toolkit # [^3] ``` - **多版本CUDA切换** 在`.bashrc`中修改`/usr/local/cuda-12.4`为其他版本路径
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值