浅谈事务
事务这一块,做开发是绕不开的,关于事务分为一般的事务(本质是数据库事务,spring事务本质上也是数据库事务,后面描述简称为事务)和分布式事务。一般考官问事务特性,传播行为啥的都只是在问一般的事务。
事务特点:
原子性:原子性是指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。如,A向B转钱,在事务中的扣款和加款两条语句,要么都执行,要么都不执行。
一致性:一致性是指事务使得系统从一个一致的状态转换到另一个一致状态。如,A和B存款总额为1000,A向B转钱,无论失败,最终A和B的存款总额依然为1000.
隔离性:多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。数据库多个事务之间操作可能出现的问题以及事务隔离级别是这篇文章介绍的重点。
持久性:持久性,意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。即使出现了任何事故比如断电等,事务一旦提交,则持久化保存在数据中。
事务传播行为:
PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务。(默认)
PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。
PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
MySql的四中隔离级别:
* Read Uncommitted(读取未提交内容)在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。读取未提交的数据,则会发生赃读
* Read Committed(读取提交内容)一个事务只能看见已经提交事务所做的改变。这是大多数数据库系统的默认隔离级别,但非MySql。一个事务多次读取的过程中,另一个事务可能对同一
条数据做修改并提交,导致前一个事务多次读取到的数据不一致,则会发生不可重复读
* Repeatable Read(可重读)它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。这是MySql的默认隔离级别,但,此级别依然会发生幻读
* Serializable(可串行化)它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。
事务为什么能隔离(隔离原理)?
主要有两个技术:MVCC(多版本并发控制)和锁。
如果没有MVCC,当想要读取的数据被其他事务用排它锁锁住时,只能互斥等待;而这时MVCC可以通过提供历史版本从而实现读取被锁的数据的历史版本,从而避免了互斥等待。
事物怎么保证事物的隔离性?
未提交读:原理
1,事务对当前被读取的数据不加锁;
2,事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加 行级共享锁,直到事务结束才释放。
提交读:原理
1,事务对当前被读取的数据加 行级共享锁(当读到时才加锁),一旦读完该行,立即释放该行级共享锁;
2,事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加 行级排他锁,直到事务结束才释放。
可重复读:原理
1,事务在读取某数据的瞬间(就是开始读取的瞬间),必须先对其加 行级共享锁,直到事务结束才释放;
2,事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加 行级排他锁,直到事务结束才释放。
窜行化:原理
1,事务在读取数据时,必须先对其加 表级共享锁 ,直到事务结束才释放;
2,事务在更新数据时,必须先对其加 表级排他锁 ,直到事务结束才释放。
spring怎么管理事务?
Spring并不直接管理事务,而是提供了多种事务管理器DataSourceTransactionManager:位于org.springframework.jdbc.datasource包中,数据源事务管理器,提供对单个javax.sql.DataSource事务管理,用于Spring JDBC抽象框架、iBATIS或MyBatis框架的事务管理;
spring怎么事务种类?
编程式事务管理:将事务管理代码嵌入到业务方法中来控制事务的提交和回滚,在编程式事务中,必须在每个业务操作中包含额外的事务管理代码
声明式事务管理:大多数情况下比编程式事务管理更好用。它将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理。事务管理作为一种横切关注点,可以通过AOP方法模块化。Spring通过Spring AOP框架支持声明式事务管理。
声明式事务通过传播行为,隔离级别,只读提示,事务超时及回滚规则来进行定义。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)