今天看到数据库的恢复技术那一章,关于事务的这一块有些不明白,做隔离测试的时候遇到一些问题。
上百度搜到一篇文章,写得很详细很清楚。
推荐上来看看。
文章来自百度空间——风沙度。
(主要是为了交流。不知道会不会侵权什么的,会的话和我说,我马上道歉。。。。)
oracle的事物隔离级别(isolation_level)
有人问到,原来有点印象,现在整理一下。
首先说,隔离级别定义了事务与事务之间的隔离程度。隔离程度与并发度成反比。
oracle提供了两种隔离级别,分别是
read committed,递交后可读(默认级别)
serializable,序列化执行,仅能看到当前事物开始之前,其他事物已提交的和本事物中的操作。
有朋友说还有第三种,read only,这种级别在export 时,加入object_consistent=y 时生效,不能手动设置
测试如下:
设置事物1
SQL> alter session set isolation_level=serializable;
会话已更改。
SQL> select count(*) from emp;
COUNT(*)
----------
0
SQL> insert into emp (empno) values (1);
已创建 1 行。
SQL> select count(*) from emp;
COUNT(*)
----------
1
开启另外一个事物2
SQL> select count(*) from emp;
COUNT(*)
----------
0
SQL> insert into emp (empno) values(2);
已创建 1 行。
SQL> commit;
提交完成。
SQL> select count(*) from emp;
COUNT(*)
----------
1
回到事物1中,
SQL> select count(*) from emp;
COUNT(*)
----------
1
此时,无法看到事物2递交的数据。把事物1递交后,事情发生变化,
SQL> commit;
提交完成。
SQL> select count(*) from emp;
COUNT(*)
----------
2
能看到事物2递交的数据了。
测试2
在事物2中更新操作
SQL> select empno,ename from emp;
EMPNO ENAME
---------- ----------
1
2
SQL> update emp set ename='tom' where empno=1;
已更新 1 行。
SQL> rollback;
回退已完成。
SQL> update emp set ename='tom' where empno=1;
已更新 1 行。
事物1中修改事物2所修改的行,
SQL> update emp set ename=ename||'jack' where empno=1;
此时,锁的原因,事物1等待。
如果事物2执行rollback,则事物1递交。
如果事物2执行commit,则事物1抛出ORA-08177: 无法连续访问此事务处理的异常,因为事物1看不到事物2的修改,且想在事物2修改的基础上再次修改,所以出错。
设置隔离级别:
alter session set isolation_level={serializable||read committed};