日期:2014-05-16  浏览次数:20534 次

相关隔离 事务隔离级别 脏读 不可重复读 幻读

?

1.演示脏读发生

a窗口
set transaction isolation level read uncommitted;
start transaction;
select * from account;
-------------发现a帐户是1000元,转到b窗口
select * from account;
-------------发现a帐户是1100元,发生了脏读(这个事务读取到了别的事务未提交的数据)


b窗口
start transaction;
update account set money=money+100 where name='aaa';
-------------事务在不提交的情况下,转到a窗口进行查询

2.避免脏读,并演示不可重复读问题的发生


a窗口
set transaction isolation level read committed;
start transaction;
select * from account;
-------------发现a帐户是1000元,转到b窗口
select * from account;
-------------发现a帐户是1000元,这时我们发现read committed这种级别可以避免脏读
-------------转到b窗口
select * from account;
-------------发现a帐户是1100元,这时就发生不可重复读(指这个事务读取到了别的事务提交的数据)

b窗口
start transaction;
update account set money=money+100 where name='aaa';
-------------事务在不提交的情况下,转到a窗口进行查询
commit;
-------------转到a窗口

3.避免脏读、不可重复读,并演示虚读问题的发生


a窗口
set transaction isolation level repeatable read;
start transaction;
select * from account;
--------------------发现a帐户是1000元,并且表的总纪录数是3条,这时转到b窗口
select * from account
--------------------发现a帐户是1000元,这说明repeatable read这种级别可避免脏读
-------------------转到b窗口
select * from account
---------------------发现a帐户是1000元,这说明repeatable read这种级别还可以避免不可重复读
---------------------转到b窗口
select * from account
---------------------发现表中可能会多出一条ddd的记录,这就发生了虚读,也就是在这个事务内读取了别的事务插入的数据(幻影数据)

b窗口
start transaction;
update account set money=money+100 where name='aaa';
---------------------转到a窗口
commit;
---------------------转到a窗口
start transaction; ? ? ? ? ? ? ? ?这个地方另外开一个事务才可以
insert into account(name,money) values('ddd','1000');
commit;
--------------------转到a窗口 ? ? ? ? ? ? ? ? ? ? ?

4、实现最高级别

---------------------------------------------

Oracal ?只支持2种处理级别 : ReadCommint ? ? ? ? ? ? ? ?Serializable ?2种级别

?