您的位置:首页 > 数据库

数据库的四种隔离级别

2017-04-24 21:26 225 查看
串行化(Serializable,SQLite默认模式):最高级别的隔离。两个同时发生的事务100%隔离,每个事务有自己的『世界』。

可重复读(Repeatable read,MySQL默认模式):每个事务有自己的『世界』,除了一种情况。如果一个事务成功执行并且添加了新数据,这些数据对其他正在执行的事务是可见的。

但是如果事务成功修改了一条数据,修改结果对正在运行的事务不可见。所以,事务之间只是在新数据方面突破了隔离,对已存在的数据仍旧隔离。 

举个例子,如果事务A运行”SELECT count(1) from TABLE_X” ,然后事务B在 TABLE_X 加入一条新数据并提交,当事务A再运行一次 count(1)结果不会是一样的。 这叫幻读(phantom read)。

读取已提交(Read committed,Oracle、PostgreSQL、SQL Server默认模式):可重复读+新的隔离突破。如果事务A读取了数据D,然后数据D被事务B修改(或删除)并提交,
   事务A再次读取数据D时数据的变化(或删除)是可见的。 这叫不可重复读(non-repeatable read)。

读取未提交(Read uncommitted):最低级别的隔离,是读取已提交+新的隔离突破。如果事务A读取了数据D,然后数据D被事务B修改(但并未提交,事务B仍在运行中),

事务A再次读取数据D时,数据修改是可见的。如果事务B回滚,那么事务A第二次读取的数据D是无意义的,因为那是事务B所做的从未发生的修改(已经回滚了嘛)。 

这叫脏读(dirty read)。

从隔离级别低到高,分别是:读取未提交、读取已提交、可重复读、串行化。

总结

读取未提交: 就是只读取没有提交的数据

设置数据库读取未提交的数据(设置隔离级别):set session transaction isolation level read uncommitted;

读取提交:

读取已提交:就是只读取提交的数据

设置数据库读取未提交的数据(设置隔离级别):set session transaction isolation level read committed;

可重复读:那就是窗口2的事务就算提交了数据修改,我窗口1的事务也不管,还是只读取到原来的数据。

设置数据库读取未提交的数据(设置隔离级别):set session transaction isolation level repeatable read;

串行化:

REPEATABLE READ:在mysql中,不会出现幻读。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: