程序员人生 网站导航

Atitit.数据库事务隔离级别 attilax 总结

栏目:数据库应用时间:2015-01-30 08:46:12

Atitit.数据库事务隔离级别

 

1. 事务隔离级别的作用 1

2. 在的隔离级别 2

3. 常见数据库的默许管理级别 3

 

1. 事务隔离级别的作用

 

 

较低的隔离级别可以增强许多用户同时访问数据的能力,但也增加了用户可能遇到的并发副作用(例如脏读或丢失更新)的数量。相反,较高的隔离级别减少了用户 可能遇到的并发副作用的类型,但需要更多的系统资源,并增加了1个事务阻塞其他事务的可能性。应平衡利用程序的数据完全性要求与每一个隔离级别的开消,在此 基础上选择相应的隔离级别。最高隔离级别(可序列化)保证事务在每次重复读取操作时都能准确检索到相同的数据,但需要通过履行某种级别的锁定来完成此操 作,而锁定可能会影响多用户系统中的其他用户。最低隔离级别(未提交读)可以检索其他事务已修改、但未提交的数据。在未提交读中,所有并发副作用都可能 产生,但由于没有读取锁定或版本控制,所以开消最少

 

作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/attilax

 

 

 

当多个事务同时进行时,通过设置隔离级别来处理脏读不可重复读幻读事件

read uncommitted | 0 未提交读

将查询的隔离级别指定为 0。

可以读脏数据

读脏数据:1事务对数据进行了增删改,但未提交,有可能回滚,另外一事务却读取了未提交的数据

read committed | 1 已提交读

将查询的隔离级别指定为 1。

避免脏读,但可以出现不可重复读幻读

不可重复读:1事务对数据进行了更新或删除操作,另外一事务两次查询的数据不1致

幻像读:1事务对数据进行了新增操作,另外一事务两次查询的数据不1致

repeatable read | 2 可重复读

将查询的事务隔离级别指定为 2。

避免脏读,不可重复读,允许幻像读

serializable | 3 可序列化

将查询的隔离级别指定为 3。

串行化读,事务只能1个1个履行,避免了脏读不可重复读、幻读

履行效力慢(我遇到过1种情况,用时是隔离级别1的30倍),使用时慎重

SNAPSHOT  

当读取数据时,可以保证读操作读取的行是事务开始时可用的最后提交版本。

这意味着这类隔离级别可以保证读取的是已提交过的数据,并且可以实现可重复读,

也能确保不会幻读。不过这类隔离级别使用的不是同享锁,而是行版本控制

SQL Server 2005以后的版本支持。

下表显示了不同隔离级别允许的并发副作用。

隔离级别

脏读

不可重复读

虚拟读取

未提交读

已提交读

可重复读

快照

可序列化

 

 

2. 在的隔离级别

EAD UNCOMMITTED 指定语句可以读取已由其他事务修改但还没有提交的行。 在 READ UNCOMMITTED 级别运行的事务,不会发出同享锁来避免其他事务修改当前事务读取的数据。READ UNCOMMITTED 事务也不会被排他锁阻塞,排他锁会制止当前事务读取其他事务已修改但还没有提交的行。设置此选项以后,可以读取未提交的修改,这类读取称为脏读。在事务结束 之前,可以更改数据中的值,行也能够出现在数据集中或从数据集中消失。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 NOLOCK 相同。这是隔离级别中限制最少的级别。

READ COMMITTED 指定语句不能读取已由其他事务修改但还没有提交的数据。这样可以免脏读。其他事务可以在当前事务的各个语句之间更改数据,从而产生不可重复读取和幻像数据。该选项是 SQL Server 的默许设置。

REPEATABLE READ 指定语句不能读取已由其他事务修改但还没有提交的行,并且指定,其他任何事务都不能在当前事务完成之前修改由当前事务读取的数据。 对事务中的每一个语句所读取的全部数据都设置了同享锁,并且该同享锁1直保持到事务完成为止。这样可以避免其他事务修改当前事务读取的任何行。其他事务可以 插入与当前事务所发出语句的搜索条件相匹配的新行。如果当前事务随后重试履行该语句,它会检索新行,从而产生幻读。由于同享锁1直保持到事务结束,而不是 在每一个语句结束时释放,所以并发级别低于默许的 READ COMMITTED 隔离级别。此选项只在必要时使用。

3. 常见数据库的默许管理级别

Mssql的默许级别 默许的READ COMMITTED隔离级别来访问数据

 

 

首先要明确Oracle里支持的隔离级别:read committed/serializable,默许的是read committed,而MySQl支持的隔离级别:read uncommitted/read committed/repeatable read/serializable,默许的是repeatable read;

先说结论:Oracle的read committed的锁力度和隔离级别相当于MySQL的read committed,因此Oracle里默许的1致读对

 

Oralce_MySQL默许隔离级别对照 - Oracle - 次元立方网 - 电脑知识与技术互动交换平台.htm

隔离级别_百度百科.htm

 

这个触及到数据库的隔离级别。默许情况下,oraclemssqlmysql都是READ COMMITTED隔离级别来访问数据

你这个原理是这样::

事务A,打开 ,然后读取了数据,此时还没有提交A事务
事务B紧接的更新数据,并提交事务

事务A再次读取该数据,发现数据已改变了。

 

由于,默许数据库READ COMMITTED级别,顾名思义,就是可以保证读取已提交的数据,避免脏读。。

如果为了性能斟酌,更改了数据库的配置默许隔离级别为 read uncommitted,就不是这样的情况了,就发现不了数据的改变了。。

 

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐