ALTER SESSION SET ISOLATION_LEVEL = READ COMMITTED;
ALTER SESSION SET ISOLATION_LEVEL = serializable;
数据初始化
下面的2个实验,在开始前需要使用上面的初始化脚本Reset数据.
DROP TABLE XXRPTH.TEST;
CREATE TABLE XXRPTH.TEST
(
NAME VARCHAR(10),
VALUE NUMBER(22)
);
insert into test values('lilao_1', 1);
insert into test values('lilao_2', 2);
insert into test values('lilao_3', 3);
commit;
实验#1: 读取变化数据的区别
关键比较点,已经标红高亮
时间
事务1
事务2
Read Commitment
Serializable:
t1
savepoint aaa;
显示开启事务1
t2
savepoint bbb;
显示开启事务2
t3
update test
set value=value+10 ;
t4
select count(*) from test
where value>10;
结果是0(读可提交)
结果是0
t5
commit;
t6
select count(*) from test
where value>10;
结果是3(幻象读,和t4时间读取的记录条数不一样了)
结果是0
t7
commit;
t8
select * from test;
NAME VALUE
---------- ----------
lilao_1 11
lilao_2 12
lilao_3 13
NAME VALUE
---------- ----------
lilao_1 11
lilao_2 12
lilao_3 13
实验#2: 写冲突的区别
关键比较点,已经标红高亮
时间
事务1
事务2
Read Commitment
Serializable:
t1
savepoint aaa;
显示开启事务1
t2
savepoint bbb;
显示开启事务2
t3
update test
set value=value+10 ;
t4
select count(*) from test
where value>10;
结果是0(读可提交)
结果是0
t5
update test
set value=value+100;
t6
commit;
事务2提交时,事务1会抛出异常
ORA-08177: can't serialize access for this transaction
t7
select * from test;
NAME VALUE
---------- ----------
lilao_1 111
lilao_2 112
lilao_3 113
NAME VALUE
---------- ----------
lilao_1 1
lilao_2 2
lilao_3 3
t8
commit;
虽然事务1在T6时,抛出异常,但是事务并未终止.
所以T7时间没有查询到事务2的修改
t9
select * from test;
NAME VALUE
---------- ----------
lilao_1 111
lilao_2 112
lilao_3 113
NAME VALUE
---------- ----------
lilao_1 11
lilao_2 12
lilao_3 13