ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 数据库 >> MySql >> 再谈mysql repeatable事务级别适用场景与SQL Server的snapshot隔离级别

再谈mysql repeatable事务级别适用场景与SQL Server的snapshot隔离级别(1/3)

来源:网络整理     时间:2016-01-21     关键词:

本篇文章主要介绍了"再谈mysql repeatable事务级别适用场景与SQL Server的snapshot隔离级别",主要涉及到方面的内容,对于MySql感兴趣的同学可以参考一下: 我们先看看业界标准ANSI/ISO SQL标准定义了4中事务隔离级别:未提交读(read uncommitted),提交读(read committed),重复...



我们先看看业界标准

ANSI/ISO SQL标准定义了4中事务隔离级别:未提交读(read uncommitted),提交读(read committed),重复读(repeatable read),串行读(serializable)。

对于不同的事务,采用不同的隔离级别分别有不同的结果。不同的隔离级别有不同的现象。主要有下面3种现在:

1、脏读(dirty read):一个事务可以读取另一个尚未提交事务的修改数据。

2、非重复读(nonrepeatable read):在同一个事务中,同一个查询在T1时间读取某一行,在T2时间重新读取这一行时候,这一行的数据已经发生修改,可能被更新了(update),也可能被删除了(delete)。

3、幻像读(phantom read):在同一事务中,同一查询多次进行时候,由于其他插入操作(insert)的事务提交,导致每次返回不同的结果集。

不同的隔离级别有不同的现象,并有不同的锁定/并发机制,隔离级别越高,数据库的并发性就越差,4种事务隔离级别分别表现的现象如下表:

隔离级别脏读非重复读幻像读
read uncommitted允许允许允许
read committed 允许允许
repeatable read  允许
serializable  

标准的repeatable read是允许幻读的,因为这一级别只在读取过的纪录上加共享锁,防止别其它事务修改,但是不禁止其它人插入新数据.

比如在SQL Server RR事务中:

select * from t where id in (1,2)

如果两条纪录都存在,那么他们都会被锁定,保证后续不会被他人修改,但是如果某条纪录不存在,RR是不会禁止其它人插入对应id纪录的.

而且在其它人插入新数据后,SQL Server随后再执行select也可以获得新插入的纪录.RR保证读到的都不会被修改,但是没读到的不做任何保证.

而mysql的RR级别,

All consistent reads within the same transaction read the snapshot established by the first read

当第一次读的时候,他们就被固化(快照)了,自己再也无法发现他们的任何变化,但是却不禁止其它人修改删除插入.

其它人修改删除插入也都不可见.可以说mysql的RR直接连幻读也避免了.

相关图片

相关文章