事物处理与并发控制
授课教师:李 
目标:
Oracle中的事务处理是什么
怎样控制Oracle中的事务处理
Oracle怎样在数据库中实现并发控制,让多个用户同时访问和修改相同的数据表
1 什么是事务
事务就是在数据库上完成的一个操作。要么全部执行并且存储需要的操作,要么全部撤销已经进行的操作,使得数据库恢复到没有改变之前的状态。
2 事务处理控制语句
Oracle中的一个重要的概念就是没有“开始事务处理”的语句。用户不能显式开始一个事务,
事务结束时需要向数据库提交(Commit),或者回滚(Rollback)操作。
COMMIT
ROLLBACK
SAVEPOINT
ROLLBACK TO SAVEPOINT
SET TRANSACTION
SET CONSTRAINTS
2.1 COMMIT处理
当提交时,我们需要处理三个任务:
1、 为我们的事务处理生成SCN(系统改变号)。
2、 将所有剩余的已经缓冲的重做日志表项写入磁盘,并且将SCN记录到在线重做日志文件中。由LGWR执行处理。
3、 释放我们的会话所锁定的资源。
LGWR会在下列情况之一发生时执行清理工作:
每隔3秒
当SGA中的Redo Log Buffer Cache容量超过1/3的空间,或者包含了1MB或者更多的已经缓冲数据
进行任何事务处理提交
2.2 ROLLBACK处理
回滚是一项比较耗费资源的操作。当我们不需要存储所作出的修改时,就回滚我们的操作。回滚可以归结为异常处理范畴。
2.3 SAVEPOINT 和ROLLBACK TO SAVEPOINT
SAVEPOINT可以在应用中建立保存点。它可以让用户将单独的大规模事务处理分割成一系列较小的部分。
2.4 SET TRANSACTION
SET TRANSACTION必须是你的事务处理的第一条语句,用来设置事务之间的隔离级别。
规定事务处理的隔离级别
规定为用户事务处理所使用的特定回滚段
命名用户事务处理
SET TRANSACTION READ ONLY
SET TRANSACTION READ WRITE
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
SET TRANSACTION ISOLATION LEVEL READ COMMITED
1、 READ ONLY
命令SET TRANSACTION READ ONLY将会做两件事情。
session如何设置和读取首先而且最明显的是:它会确保你无法执行修改数据的DML操作。如果你要执行这样的操作,就会报错。
另外,READ ONLY可以使得我们把数据库视图冻结在某个时间点。
例如:我们需要获得上午10:00使,数据库中某个数据表中的数据,而这张表又与其它很多数据表之间存在复杂的关联关系。数据库的其它用户有可能继续对其它的一些表随时都在进行DML操作。我们如何获得10:00时我们需要的数据?
一种方法是:停止其它用户的所有活动,锁定相关的数据表。
好的方法是:用户可以使用SET TRANSACTION READ ONLY语句,冻结1000的用户数据库视图。这样你会看到你需要的数据,而且不会影响其它用户的操作。
实验:冻结视图
打开三个SQL Plus窗口完成实验
要点:在第一个SQL Plus窗口中设置 SET TRANSACTION READ ONLY
 时间
会话1
会话2
会话3
说明
T1
set transaction read only;
T 2
select count(*) from t;
select count(*) from t;
两个事务处理都可以看到2000行
T3
delete from t where rownum<=500;
从T表中删除500行,但是没有提交
T4
select count(*) from t;
select count(*) from t;
由于多版本的作用,所以这两个会话都会看到2000行
T5
commit;
T6
select count(*) from t;
select count(*) from t;
会话1仍然会看到2000行,会话2现在将要看到1500行!到提交或者回滚为止,会话1一直在表T中看到2000行
T7
insert into t
select * from t;
对T表再插入记录,使其记录的数量到达3000行
T8
commit
T9
select count(*) from t;
select count(*) from t;
会话1将看到2000行,但是会话2会看到3000行
T10
commit
T11
select count(*) from t;
会话1将会看到3000行
2、 READ WRITE
默认设置
SET TRANSACTION READ WRITE是默认设置,不会经常使用。
3、 ISOLATION LEVEL SERIALIZABLE
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE与READ ONLY有一些类似。当使用了这个命令之后,无论是否出现改变,数据库都会为你进行“冻结”。使得用户完全可以在隔离状态下进行自己的操作,完全隔离其它事务处理对你的影响。这里主要的区别就是你可以在串行化事务处理中执行任何需要的DML语句。
4、 ISOLATION LEVEL READ COMMITED
这个命令大体相当于将事务处理设置为READ WRITE,由于它是设置隔离层次时Oracle默认操作模式,所以很少使用。如果用户在会话的前面使用ALTER SESSION命令,将用户会话的事务处理的默认隔离层次从READ COMMITED改变为SERIALIZABLE,那么就可能会用到这个命令。使用ISOLATION LEVEL READ COMMITED命令可以重置默认值。
5、 SET CONSTRAINTS
   
3 事务处理的ACID属性
原子性
一致性
隔离性
持久性
3.1 原子性
语句级原子性
create table t2(cnt int);

insert into t2 values(0);

create table tp(
      x int check(x>0)
);

create trigger tp_trigger
before insert or delete on tp for
each row
begin
    if(inserting)then
                      update t2
                      set cnt=cnt+1;
    else
        update t2 set cnt=cnt-1;
    end if;
    dbms_output.put_line('I fired and updated '||sql%rowcount||'rows.');
end;

set serveroutput on
insert into tp values(1);

insert into tp values(-1);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。