深入理解MySQL的四个隔离级别
首先,第一件事是什么事务是应用程序中的一系列紧密操作,所有操作都必须成功完成,否则每个操作中的所有更改都将被撤销,即事务是原子的,事务中的一系列操作要么成功要么没有。
事务的结束是两个,事务在成功执行所有步骤时提交,如果其中一个步骤失败,将发生回滚操作,并在撤消到事务开始时的操作被撤销。
两。交易的酸性
交易有四个特点:Atomicity,一致性,隔离性和持久性。这四个特征被称为短酸特性。
1。Atomicity,一个事务是数据库的逻辑单元,并包括在交易业务要么做或不做。
2。一致性,事务执行的结果必须是数据库从一个一致性变化到另一个。所以当数据库只包含成功的事务提交的结果,这是说,数据库处于一致的状态。如果在数据库系统运行中发生故障,该交易尚未对一些这些未完成的事务完成中断,对数据库部分的变化已写入物理数据库,该数据库是一个糟糕的状态,或者说是不一致的状态。
3,隔离。事务的执行不受其他事务的干扰。也就是说,事务中的操作和所使用的数据与其他并发事务隔离,并且执行的各种事务不能互相干扰。
4。持久性也称为永久性,一旦提交了一个事务,它对数据库中数据的更改应该是永久的。随后的操作或失败不应该对执行结果产生任何影响。
三,MySQL的四个隔离级别
SQL标准定义了4类隔离级别,包括一些特定的规则来限制事务内外可见的变化以及不可见的变化,而低级别隔离级别通常支持更高的并发处理,并且具有较低的系统开销。
读未提交(读未提交内容)
在这种隔离级别,所有事务都可以看到其他未提交事务的执行结果。这种隔离级别很少用于实际应用程序,因为它不比其他级别执行得更好。
读取提交(读取提交)
这是大多数数据库系统的默认隔离级别(而不是MySQL默认)。它满足隔离的简单定义:一个事务只能看到被致力于公司的变化。该隔离级别也支持所谓的不可重复读。因为同一事务的其他实例在实例处理过程中可能有新的提交,因此相同的选择可能返回不同的结果。
可重复读(重读)
这是MySQL默认的事务隔离级别,使同一事务的多个实例可以看到同样的数据行时,读取数据的同时,但在理论上,这可能会导致另一个棘手的问题:幻读。简单地说,幻读,当用户读取一系列的数据行,另一个交易中插入新的一行,范围。当用户读取数据行了,会有新的幻像行。InnoDB和Falcon存储引擎已经解决了这个问题,通过多版本并发控制(MVCC,多版本并发控制)机制。
序列化(序列化)
这是最高级别的隔离,这使得通过强制事务解决幻象问题不可能相互冲突。简而言之,它是每个读取数据线上的共享锁。在这个级别上,它可能导致大量超时现象和锁竞争。
这四个隔离级别是用不同的锁类型实现的。如果读取相同的数据,则很容易出现问题:
脏读(脏读):一个事务更新了数据,另一个事务读取相同的数据,此时。由于某些原因,前一次回滚操作、后一个办公室读取的数据将不正确。
不可重复读不可重复。在事务的两个查询中,数据不一致。这可能是两个查询过程,其中插入事务更新原始数据。
(幽灵读取)幻像读取:在两个查询中,事务数据中的数目不一致,如事务查询数列(行)数据和另一个事务,但此时,一些新数据进入列,前一个事务在下一个查询中,您会发现几个列的数据是它以前没有的。
在MySQL中,这四个隔离级别被实现,并且有可能出现的问题如下所示:
四。测试MySQL的隔离级别
接下来,我们将使用MySQL的客户机程序来测试这些隔离级别。
测试数据库是演示,表是测试;表结构是:
这两个命令行客户端是A、B;不断改变A的隔离级别,并修改B侧的数据。
(1)设置一个读到未提交(未提交读)的隔离级别。
答:启动事务,此时数据是初始状态。
B:启动事务,更新数据,但不提交
答:再次读取数据,发现数据已被修改,这就是所谓的脏读。
B:回滚事务
答:再次读取数据,并将数据恢复到初始状态。
从上面的实验可以得出结论,事务B更新了一个记录,但是没有提交,此时事务A可以查询未提交的记录,导致脏读现象,未提交的读取是隔离的最低级别。
(二)客户机A的事务隔离级别设置为读提交(提交读取)
答:启动事务,此时数据是初始状态。
B:启动事务,更新数据,但不提交
答:再次读取数据,发现数据没有被修改。
B:提交一笔交易
答:再次读取数据,发现数据已经改变,表明B提交是由事务中的A读取的,这就是所谓的不重复。
通过以上实验,可以得出结论,读隔离级别已提交解决脏读的问题,但是有一个问题不重复阅读,即交易的不匹配的查询数据,因为B更新数据之间的查询,只允许提交读读提交的记录,但它不需要反复阅读。
(三)将A的隔离级别设置为可重复读取(可重复读取)。
答:启动事务,此时数据是初始状态。
B:启动事务,更新数据,但不提交
答:再次读取数据,发现数据没有被修改。
B:提交一笔交易
答:再次读取数据,发现数据仍然没有变化,这意味着它可以再次读取这个时间。
B:插入一个新数据并提交它
答:再次读取数据后,发现数据仍保持不变。尽管它可以反复读取,但它发现它不是最新的数据。这就是所谓的魔法阅读。
答:提交此事务,再次读取数据,并发现读取是正常的。
从以上的实验结果,可以得出结论,可重复读隔离级别只能读取记录,当其它的交易由一个事务读两次,更新另一个事务部的记录,但这种交易不需要与其他事务序列化。例如,当一个事务可以找到由提交的事务更新的记录,它可能会导致影像阅读问题。像上述试验,没有数据读取的问题。
(四)设置一个隔离级别Serializable(序列化)
答:启动事务,此时数据是初始状态。
B:发现B此时处于等待状态,因为A的事务尚未提交,只能等待(此时,B可能正在等待超时)。
答:提交交易
B:找到插入成功
序列化完全锁领域,如果一个事务查询相同的数据,它必须等到前一交易完成后,锁是锁着的。它是一个完整的隔离级别,将锁定的相应数据表从而有一个有效的问题。
总结
这是本文的全部内容,希望这篇文章的内容对大家的学习或有所帮助,如果有问题可以留言交流。