Spring 事物管理与原理
定义与描述
Spring 有事物传播属性,用于保证数据的统一提交与统一回滚
数据库 有事物特性(ACID)与数据隔离级别,用于处理脏读、幻读、不可重复读
Spring 事物管理,是指系统在多线程情况下,配合数据库事物完成数据的统一提交与统一回滚。网上很多关于事物的描述,都是基于数据库实现的。例如,银行转账、收费站收费等。
本片文章只讲事物管理
事务传播行为类型 | 使用说明 |
---|---|
REQUIRED | 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,继续当前事物。 |
SUPPORTS | 支持事务。但如果当前没有事务,就以非事务方式执行。事物可有可无 |
MANDATORY | 使用事务,如果当前没有事务,就抛出异常。 |
REQUIRES_NEW | 新建事务,如果当前存在事务,把当前事务挂起。然后创建一个与外事务没有关联的新事务。新事物有自己的隔离级别、锁。不依赖于外事务,可单独提交与回滚。新事物执行完后,外事务在进行提交操作。 |
NOT_SUPPORTED | 不支持事物。如果当前存在事务,就把当前事务挂,执行内部方法。内部方法执行完,在执行外部事务。如果外部方法没有事务,可直接执行,不会挂起。 |
NEVER | 不使用事物。如果当前存在事务,则抛出异常。 |
NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行REQUIRED类似的操作。内事务与外事务的关系:內事务必须在外事务提交之后在提交内事务的报错,会直回到保存点(savepoint,任务执行前的点),不会影响外事务的提交外事的报错会影响內事务的提交 |
REQUIRED、REQUIRES_NEW、NESTED ,这三个是日常系统中最常用的三种。
Spring 事物原理
Spring事务是通过AOP实现的,首先是获取代理对象,然后通过AOP的整体流程执行后面的操作逻辑。一般是通过通知的方式实现功能增强,但事务是通过TransactionInterceptor
来实现的,通过调用invoke
完成事务逻辑。主要是调用其父类(TransactionAdviceSupportd
)的invokeWithInTransaction
方法,以下逻辑也是此方法里的逻辑。
@EnableTransactionManagement 注解开启事物管理。
逻辑步骤:
- 准备工作,解析各个方法的注解与属性,判断是否需要重新开启新事务
- 如果开始事务,需要后去数据库链接,并关闭自动提交功能
- 执行sql
- 如果失败,执行
completeTransactionAfterThrowing
方法,调用里面的doRollBack
方法 - 如果成功,执行
commitTransactionAfterReturn
方法,调用里面的doCommit
方法 - 最后的最后,执行
cleanTransactionInfo
方法,清空事务信息
invokeWithInTransaction 代码逻辑(简化)
__EOF__

本文作者:之士咖啡
本文链接:https://www.cnblogs.com/zz-1q/p/16119003.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/zz-1q/p/16119003.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人