ORACLE数据库事务隔离级别
来源:互联网 发布:java 获取进程id 编辑:程序博客网 时间:2024/04/28 07:04
事务隔离级别:一个事务对数据库的修改与并行的另一个事务的隔离程度。
两个并发事务同时访问数据库表相同的行时,可能存在以下三个问题:
1、幻想读:事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录,恰好满足T1的where条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻想。
2、不可重复读取:事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录,然后T1再次查询,发现与第一次读取的记录不同,这称为不可重复读。
3、脏读:事务T1更新了一行记录,还未提交所做的修改,这个T2读取了更新后的数据,然后T1执行回滚操作,取消刚才的修改,所以T2所读取的行就无效,也就是脏数据。
为了处理这些问题,SQL标准定义了以下几种事务隔离级别
READ UNCOMMITTED 幻想读、不可重复读和脏读都允许。
READ COMMITTED 允许幻想读、不可重复读,不允许脏读
REPEATABLE READ 允许幻想读,不允许不可重复读和脏读
SERIALIZABLE 幻想读、不可重复读和脏读都不允许
Oracle数据库支持READ COMMITTED 、SERIALIZABLE两种事务隔离级别。
SQL标准所定义的默认事务隔离级别是SERIALIZABLE,但是Oracle 默认使用的是READ COMMITTED
设置隔离级别使用 SET TRANSACTION ISOLATION LEVEL [READ COMMITTED|SERIALIZABLE]
也可以在session级设置ISOLATION LEVEL:
ALTER SESSION SET ISOLATION_LEVEL = {SERIALIZABLE | READ COMMITTED}
READ COMMITTED级别是默认的,不深入讨论,这里我们实验一下在SERIALIZABLE隔离级别下数据库行为是什么样的
当前数据:
SQL> SELECT * FROM TEST2;
ID
----------
1
2
4
session1下执行:
SQL> alter session SET ISOLATION_level=SERIALIZABLE;
Session altered.
SQL> select * from test2;
ID
----------
1
2
4
session2下执行:
SQL> delete test2 where id =1 ;
1 row deleted.
SQL> commit;
Commit complete.
SQL> select * from test2;
ID
----------
2
4
回到session2再次执行前面的query:
SQL> select * from test2;
ID
----------
1
2
4
结果没有变,与上次查询的结果一样。
尝试在session2中删除id=1的记录会发生什么情况:
SQL> delete from test2 where id =1;
delete from test2 where id =1
*
ERROR at line 1:
ORA-08177: can't serialize access for this transaction
报错信息已经提示的很明显了
原因:更新行已经在其他的会话中进行了修改,版本不一致
- ORACLE数据库事务隔离级别
- ORACLE数据库事务隔离级别
- ORACLE数据库事务隔离级别
- ORACLE数据库事务隔离级别
- ORACLE数据库事务隔离级别
- ORACLE数据库事务隔离级别
- ORACLE数据库事务隔离级别
- ORACLE数据库事务隔离级别
- ORACLE数据库事务隔离级别
- ORACLE数据库事务隔离级别
- Oracle 数据库事务隔离级别
- ORACLE数据库事务隔离级别
- ORACLE数据库事务隔离级别
- ORACLE数据库事务隔离级别
- ORACLE数据库事务隔离级别
- ORACLE数据库事务隔离级别
- ORACLE数据库事务隔离级别
- ORACLE数据库事务隔离级别
- 开发数据库篇—FMDB数据库队列
- IOS开发之——绘图(CGContext)
- selenium WebDriver 对浏览器标签页的切换
- oracle存储过程continue
- Android 干货集
- ORACLE数据库事务隔离级别
- CodeForces 522A(DFS||floyd最短路)
- 12-《电子入门趣谈》第二章_电子电路的神经网络-2.1.3三极管(重点推荐)
- Java注册邮箱激活验证实现代码
- gdb 技巧学习
- 【转】使用ActivityManager的forceStopPackage方法结束进程
- 收藏一些大神博客
- iOS 3DES加密解密(一行代码搞定)
- Error when inflating android.support.design.widget.TextInputLayout