• 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
  • 相关阅读:
    [LeetCode]230. 二叉搜索树中第K小的元素(BST)(中序遍历)、530. 二叉搜索树的最小绝对差(BST)(中序遍历)
    【二叉树-所有路经系列(根->叶子)】二叉树的所有路径、路径总和 II、路径总和、求根到叶子节点数字之和(DFS)
    [LeetCode]1083. 销售分析 II(Mysql,having+if)
    [LeetCode]196. 删除重复的电子邮箱(delete)
    [LeetCode]面试题62. 圆圈中最后剩下的数字(数学)
    [算法]十进制整数转八进制
    [LeetCode]534. 游戏玩法分析 III(Mysql)
    [LeetCode]Mysql小本本
    [LeetCode]Mysql系列5
    Java 冒泡排序的实现
  • 原文地址:https://www.cnblogs.com/chang09/p/16562889.html
Copyright © 2020-2023  润新知