博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

MySQL 数据库 隔离 的 四个级别 和 事务 的 四个特性

原文:数据库隔离的四个级别分别是什么

数据库隔离的四个级别分别是:
1、读取未提交内容;
2、读取提交内容;
3、可重复读;
4、可串行化。
隔离级别采取不同的锁类型来实现,
若读取的是同一个数据可能发生脏读、幻读等问题。

 

事务的四个性质:
1、原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么全部不执行。
2、一致性(Consistency):几个并行执行的事务,其执行结果必须与 按某一顺序串行执行的 结果相一致。
3、隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。
4、持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。

 

数据库隔离的四个级别分别为:

Read Uncommitted(读取未提交内容)

在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。

本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。

读取未提交的数据,也被称之为脏读(Dirty Read)。

Read Committed(读取提交内容)

这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。

它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。

这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),

因为同一事务的其他实例在该实例处理其间可能会有新的commit,

所以同一select可能返回不同结果。

Repeatable Read(可重读)

这是MySQL的默认事务隔离级别,

它确保同一事务的多个实例在并发读取数据时,

会看到同样的数据行。

不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。

简单的说,幻读指当用户读取某一范围的数据行时,

另一个事务又在该范围内插入了新行,

当用户再读取该范围的数据行时,会发现有新的“幻影” 行。

InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

Serializable(可串行化)

这是最高的隔离级别,它通过强制事务排序,

使之不可能相互冲突,从而解决幻读问题。

简言之,它是在每个读的数据行上加上共享锁。

在这个级别,可能导致大量的超时现象和锁竞争。

 

隔离级别设置错误会产生的问题

这四种隔离级别采取不同的锁类型来实现,

设置错误的话,在读取同一个数据时,就容易发生问题。例如:

脏读(Drity Read):

事务1在更新一份数据,事务2在此时读取了这份数据,

由于某些原因,前事务1回滚了操作,则事务2所读取的数据就是错的。

不可重复读(Non-repeatable read):

在一个事务的两次查询之中数据不一致,违背一致性原则。 

这可能是两次查询过程中间插入了一个事务提交,更新了原有的数据,

而且由此两次查询中间可能产生误判,误操作。

幻读(Phantom Read):

在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,

而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

在MySQL中,实现了这四种隔离级别,分别有可能产生问题如下所示:

隔离级别 脏读 不可重复读 幻读
读未提交
读已提交 X
可重复读 X X
可串行化 X X X
posted @   CHANG_09  阅读(73)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
点击右上角即可分享
微信分享提示