标签:strong 另一个 包括 准备 级别 并且 并行 不同 幻读
读未提交:别人改数据的事务尚未提交,我在我的事务中也能读到。
读已提交:别人改数据的事务已经提交,我在我的事务中才能读到。
可重复读:别人改数据的事务已经提交,我在我的事务中也不去读。
串行:我的事务尚未提交,别人就别想改数据。
这4种隔离级别,并行性能依次降低,安全性依次提高。
在实现上,数据库里面会创建一个视图,访问的时候以视图的逻辑结果为准。
在“可重复读”隔离级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图。
在“读提交”隔离级别下,这个视图是在每个 SQL 语句开始执行的时候创建的。
“读未提交”隔离级别下直接返回记录上的最新值,没有视图概念;
而“串行化”隔离级别下直接用加锁的方式来避免并行访问。
创建read_view,其实就是当前的事务拍了个快照,会记录【当前时刻】的一些事务id,包括进行中的、已提交的、尚未开始的等等;引擎可以根据这个read_view + 回滚段,找到【快照时刻】的数据。如果事务期间,我们一直用同一个read_view去查数据,自然可以保证【可重复读】了。而【提交读】是需要【每次都读到最新已提交】的数据的,所以每次执行SQL都创建一个全新的read_view,以保证该特性。
【提交读】不创建read_view行不行?不行,因为当前【数据页】中最新的数据是【有可能未提交】的,没有read_view作为依据,是无法确定到哪个位置(数据页/回滚段)找到已提交的数据的。相对地,【未提交读】则不需要read_view,直接获取数据页中最新的数据(不管是否提交,所以有可能会出现脏读)。
当数据库中一个事务A正在修改一个数据但是还未提交或者回滚,
另一个事务B 来读取了修改后的内容并且使用了,
之后事务A提交了,此时就引起了脏读。
此情况仅会发生在: 读未提交的的隔离级别.
在一个事务A中多次操作数据,在事务操作过程中(未最终提交),
事务B也才做了处理,并且该值发生了改变,这时候就会导致A在事务操作
的时候,发现数据与第一次不一样了。 就是不可重复读。
此情况仅会发生在:读未提交、读提交的隔离级别.
事务a 开启, 查询符合条件的数据 ,发现有10条, 准备将这10条记录修改, 此时事务b开启, 插入了一条符合事务a查询条件的记录. 提交事务, 回到事务a, a也提交事务, 当再次查询到时候, 发现修改了11条..感觉发生了幻觉一样. 此为幻读.
标签:strong 另一个 包括 准备 级别 并且 并行 不同 幻读
原文地址:https://www.cnblogs.com/wswgot/p/13373202.html