Atitit.数据库事务隔离级别 attilax 总结
Atitit.数据库事务隔离级别
1. 事务隔离级别的作用
较低的隔离级别可以增强许多用户同时访问数据的能力,但也增加了用户可能遇到的并发副作用(例如脏读或丢失更新)的数量。相反,较高的隔离级别减少了用户 可能遇到的并发副作用的类型,但需要更多的系统资源,并增加了一个事务阻塞其他事务的可能性。应平衡应用程序的数据完整性要求与每个隔离级别的开销,在此 基础上选择相应的隔离级别。最高隔离级别(可序列化)保证事务在每次重复读取操作时都能准确检索到相同的数据,但需要通过执行某种级别的锁定来完成此操 作,而锁定可能会影响多用户系统中的其他用户。最低隔离级别(未提交读)可以检索其他事务已经修改、但未提交的数据。在未提交读中,所有并发副作用都可能 发生,但因为没有读取锁定或版本控制,所以开销最少
作者:: 老哇的爪子 Attilax 艾龙, EMAIL:1466519819@qq.com
转载请注明来源: http://blog.csdn.net/attilax
当多个事务同时进行时,通过设置隔离级别来处理脏读、不可重复读、幻读事件
read uncommitted | 0 未提交读
将查询的隔离级别指定为 0。
可以读脏数据
读脏数据:一事务对数据进行了增删改,但未提交,有可能回滚,另一事务却读取了未提交的数据
read committed | 1 已提交读
将查询的隔离级别指定为 1。
不可重复读:一事务对数据进行了更新或删除操作,另一事务两次查询的数据不一致
幻像读:一事务对数据进行了新增操作,另一事务两次查询的数据不一致
repeatable read | 2 可重复读
将查询的事务隔离级别指定为 2。
serializable | 3 可序列化
将查询的隔离级别指定为 3。
串行化读,事务只能一个一个执行,避免了脏读、不可重复读、幻读
执行效率慢(我遇到过一种情况,用时是隔离级别1的30倍),使用时慎重
SNAPSHOT
当读取数据时,可以保证读操作读取的行是事务开始时可用的最后提交版本。
这意味着这种隔离级别可以保证读取的是已经提交过的数据,并且可以实现可重复读,
也能确保不会幻读。不过这种隔离级别使用的不是共享锁,而是行版本控制。
SQL Server 2005以后的版本支持。
下表显示了不同隔离级别允许的并发副作用。
隔离级别 |
脏读 |
不可重复读 |
虚拟读取 |
未提交读 |
是 |
是 |
是 |
已提交读 |
否 |
是 |
是 |
可重复读 |
否 |
否 |
是 |
快照 |
否 |
否 |
否 |
可序列化 |
否 |
否 |
否 |
2. 在的隔离级别
EAD UNCOMMITTED 指定语句可以读取已由其他事务修改但尚未提交的行。 在 READ UNCOMMITTED 级别运行的事务,不会发出共享锁来防止其他事务修改当前事务读取的数据。READ UNCOMMITTED 事务也不会被排他锁阻塞,排他锁会禁止当前事务读取其他事务已修改但尚未提交的行。设置此选项之后,可以读取未提交的修改,这种读取称为脏读。在事务结束 之前,可以更改数据中的值,行也可以出现在数据集中或从数据集中消失。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 NOLOCK 相同。这是隔离级别中限制最少的级别。
READ COMMITTED 指定语句不能读取已由其他事务修改但尚未提交的数据。这样可以避免脏读。其他事务可以在当前事务的各个语句之间更改数据,从而产生不可重复读取和幻像数据。该选项是 SQL Server 的默认设置。
REPEATABLE READ 指定语句不能读取已由其他事务修改但尚未提交的行,并且指定,其他任何事务都不能在当前事务完成之前修改由当前事务读取的数据。 对事务中的每个语句所读取的全部数据都设置了共享锁,并且该共享锁一直保持到事务完成为止。这样可以防止其他事务修改当前事务读取的任何行。其他事务可以 插入与当前事务所发出语句的搜索条件相匹配的新行。如果当前事务随后重试执行该语句,它会检索新行,从而产生幻读。由于共享锁一直保持到事务结束,而不是 在每个语句结束时释放,所以并发级别低于默认的 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里默认的一致读对
Oralce_MySQL默认隔离级别对比 - Oracle - 次元立方网 - 电脑知识与技术互动交流平台.htm
隔离级别_百度百科.htm
这个涉及到数据库的隔离级别。默认情况下,oracle,mssql,mysql都是READ COMMITTED隔离级别来访问数据
你这个原理是这样::
事务A,打开 ,然后读取了数据,此时还没有提交A事务
事务B紧接的更新数据,并提交事务
事务A再次读取该数据,发现数据已经改变了。
因为,默认数据库READ COMMITTED级别,顾名思义,就是可以保证读取已经提交的数据,防止脏读。。
如果为了性能考虑,更改了数据库的配置默认隔离级别为 read uncommitted,就不是这样的情况了,就发现不了数据的改变了。。