oracle:隔离级别
2016-08-27 22:39
260 查看
下表显示了不同隔离级别允许的并发副作用。
脏读(Dirty read)——含义和它的名字一样坏、允许读一个没有提交的,或“脏”的数据。这是 在打开其他用户正在写入的 OS 文件,并读取正好在那里的数据时所获得的结果。数据的完整性被损 害,外码被干扰,惟一的约束被忽略。
特点:能接收到在任何时间在数据库中都不会存在的(mysql中会出现示提交的)答案
非重复读取——这只不过意味着读者在时间 T1 读取一个行,并试图在时间 T2 再次读取那个行,
该行可能已经更改。它可能已经消失,它可能已经被更新,等等。
特点:一个事务中两次读的内空不一致
幻像读(Phantom read)——这意味着,如果在时间 T1 执行了一个查询,并在时间 T2 再次执行, 附加的行可能已经添加到数据库中,它将影响结果。这与非重复读取不同,在这种情况下,已经读取 的数据没有改变,但有更多的数据满足查询标准。
特点:一个事务中两次查询的条数不一致,会多。
实现方式:
已提交读 read committed:
当数据被更新时,将阻塞查询:此会话必须在该行等待, 直到持有独占锁定的事务提交;防止脏读
可重复读 repeatable read
当数据被查询时,将阻塞修改:一个共享读取锁定防止其他的会话修改已经读取的数据;会有死锁。防止非重复读
READ COMMITTED:结果在语句开始的那一刻就固定
SERIALIZABLE : 事务结果在事务开始的那一刻就固定
(本事务更新的结果本事务中再次查询可以看到,其它事务的修改本事务查询看不到)
其中:Oracle实现 SERIALIZABLE 事务方式:原本通常在语句级得到的读一致性现在可以扩展到务事级。
隔离级别 | 脏读 | 非重复读取 | 幻像读 |
---|---|---|---|
未提交读 read uncommitted | 是 | 是 | 是 |
已提交读 read committed | 是 | 是 | |
可重复读 repeatable read | 是(mysql next-key lock) | ||
可序列化/串行化 serializable |
特点:能接收到在任何时间在数据库中都不会存在的(mysql中会出现示提交的)答案
非重复读取——这只不过意味着读者在时间 T1 读取一个行,并试图在时间 T2 再次读取那个行,
该行可能已经更改。它可能已经消失,它可能已经被更新,等等。
特点:一个事务中两次读的内空不一致
幻像读(Phantom read)——这意味着,如果在时间 T1 执行了一个查询,并在时间 T2 再次执行, 附加的行可能已经添加到数据库中,它将影响结果。这与非重复读取不同,在这种情况下,已经读取 的数据没有改变,但有更多的数据满足查询标准。
特点:一个事务中两次查询的条数不一致,会多。
实现方式:
已提交读 read committed:
当数据被更新时,将阻塞查询:此会话必须在该行等待, 直到持有独占锁定的事务提交;防止脏读
可重复读 repeatable read
当数据被查询时,将阻塞修改:一个共享读取锁定防止其他的会话修改已经读取的数据;会有死锁。防止非重复读
READ COMMITTED:结果在语句开始的那一刻就固定
SERIALIZABLE : 事务结果在事务开始的那一刻就固定
(本事务更新的结果本事务中再次查询可以看到,其它事务的修改本事务查询看不到)
其中:Oracle实现 SERIALIZABLE 事务方式:原本通常在语句级得到的读一致性现在可以扩展到务事级。
Oracle Oracle 的默认事务隔离级别是READ COMMITTED Oracle数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。所以Oracle不支持脏读。 ORACLE提供了SQL92标准中的read committed和serializable,同时提供了非SQL92标准的read-only。 read-only与serializable的区别:read-only不允许在本事务中进行DM操作。 |
MySQL MySQL的默认事务隔离级别是Repeatable Read next-key lock 解决幻读 http://blog.csdn.net/tb3039450/article/details/66475638 用户可以用SET TRANSACTION语句改变单个会话或者所有新进连接的隔离级别。它的语法如下: SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE} 注意:默认的行为(不带session和global)是为下一个(未开始)事务设置隔离级别。如果你使用GLOBAL关键字,语句在全局对从那点开始创建的所有新连接(除了不存在的连接)设置默认事务级别。你需要SUPER权限来做这个。使用SESSION 关键字为将来在当前连接上执行的事务设置默认事务级别。 查看隔离级别: SELECT @@tx_isolation; |
相关文章推荐
- 深究Oracle的隔离级别
- ORACLE的隔离级别
- 4.事务提交过程,交易的基本概念,Oracle交易周期,保存点savepoint,数据库的隔离级别
- ORACLE的隔离级别
- ORACLE的隔离级别
- ORACLE的隔离级别
- Oracle 数据库事务隔离级别概述
- 4.事务提交过程,事务基本概念,Oracle中的事务生命周期,保存点savepoint,数据库的隔离级别
- 深究Oracle的隔离级别
- ORACLE的隔离级别(收藏)
- Oracle和sqlserver关于锁和隔离级别的差异
- Oracle的隔离级别
- 数据库隔离级别深入理解(ORACLE)
- ORACLE的隔离级别
- oracle事务的隔离级别和锁
- 数据库事务与隔离级别示例(oracle与sql server对比)
- 深究Oracle的隔离级别
- ORACLE的隔离级别--isolation level
- (转)mysql、sqlserver、oracle的默认事务的隔离级别
- ORACLE事物隔离级别