数据库事务
一、什么是事务#
事务(Transaction) 是计算机科学和数据库领域中的一个核心概念,主要用于确保一系列操作要么全部成功执行,要么全部不执行,从而维护数据的完整性和一致性。它广泛应用于数据库、金融系统、分布式系统等场景。
二、事务四大特性(ACID)#
-
原子性(Atomiticy)
在事务中存在多步操作时,要么全部执行,要么全部不执行。
-
一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
数据库中:事务执行的结果不会破坏任何数据库的一致性约束
-
隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,比如同时操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
-
持续性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
三、并发引发的问题#
-
脏读
多个事务,其中一个事务中读取到了另一个事务中修改且未提交的数据
-
可重复读
多个事务中,其中一个事务读取到另一个事务中修改(update)切已经提交的数据
注重修改,同一条数据前后的变化
-
幻读
他其实是可重复读的一种特例,多个事务中,其中一个事务读取到另一个事务中,增加(inster)或者删除(delete)切已经提交的数据
注重数量(条数)前后的变化主要是增加和删除
四、事务的隔离级别#
-
读未提交(read uncommitted)
是指当前事务变更数据但是还未提交,其他事务可以看到
-
读已提交(read committed)
是指当前事务变更的数据提交之后,其他事务才可以看到 (Oracle的默认隔离级别)
-
可重复读(repeatable read)
是指当前事务从开始到提交,看到的数据是一致的。(MySQL InnoDB 引擎的默认隔离级别)
-
可串行化(serializable)
对记录添加读写锁,在多个事务对这条数据读写是,如果读写冲突,则必须等待第一个事务完成提交之后才可以继续执行
隔离级别 | 脏读 | 可重复读 | 幻读 |
---|---|---|---|
读未提交 | 存在 | 存在 | 存在 |
读已提交 | 不存在 | 存在 | 存在 |
可重复读 | 不存在 | 不存在 | 存在 |
可串行化 | 不存在 | 不存在 | 不存在 |
五、事物的传播行为#
-
required
如果当前存在事务就加入事务,如果不存在事务就创建新的事务
-
requires_new
如果当前存在事务,就挂起但前事务,创建新的事务,如果不存在事务就创建新的事务
-
supports
如果存在事务就加入事务,如果不存在事务就以非事务的方式执行
-
not_supported
如果存在事务就挂起,如果不存在事务就医非事务的方式执行
-
never
如果不存在事务就以非事务方式执行,如果存在事务就抛出异常
-
mandatory
如果存在事务就加入事务,如果不存在事务就抛出异常
-
nested
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则行为等同于 required
其他#
mysql数据库InnoDB引擎中,隔离性其中的读已提交和可重复读是靠MVCC
实现的。
读已提交:在一个事务中每次读取是都会获取一个版本号,查询当前版本号和当前版本号之前的数据
可重复读:在一个事务中第一次读取获得一个版本号,第二次读取会使用当前版本号,所以可以防止重复读
上面的解释不是很规范,建议学习一下MVCC
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统