以文本方式查看主题

-  课外天地 李树青  (http://www.njcie.com/bbs/index.asp)
--  数据库系统原理课件  (http://www.njcie.com/bbs/list.asp?boardid=19)
----  Oracle的事务管理方法  (http://www.njcie.com/bbs/dispbbs.asp?boardid=19&id=836)

--  作者:admin
--  发布时间:2009/12/3 19:35:48
--  Oracle的事务管理方法

1、自动事务(一个语句要么全部执行,要么全不执行)
ALTER TABLE "SYSTEM"."STUDENT" ADD ( CHECK (height>0 and height<3) VALIDATE )

select * from student

insert into student values ( \'000008\',\'徐舟\',1,TO_DATE(\'30-5月 -1994\',\'dd-Mon-yyyy\'),2.01);

select * from student

update student set height=height+1

select * from student

2、显式事务
CREATE TABLE TestBatch (Cola NUMBER PRIMARY KEY, Colb VARCHAR2(3))

2、1
下面的代码不能执行(查询检索通过不了)
BEGIN
INSERT INTO TestBatch VALUES (1, \'aaa\');
INSERT INTO TestBatch VALUES (2, \'bbb\');

-- Syntax error
INSERT INTO TestBatch VALUSE (3, \'ccc\');
END;
/

select * from TestBatch

如果没有语句块,可以执行到错误语句之前
INSERT INTO TestBatch VALUES (1, \'aaa\');
INSERT INTO TestBatch VALUES (2, \'bbb\');

-- Syntax error
INSERT INTO TestBatch VALUSE (3, \'ccc\');

--
delete from TestBatch

2、2
下面的代码会有自动事务管理,出现错误自动回退
BEGIN
INSERT INTO TestBatch VALUES (1,\'aaa\');
INSERT INTO TestBatch VALUES (2,\'bbb\');

-- Duplicate key error
INSERT INTO TestBatch VALUES (1,\'ccc\');
END;
/

select * from TestBatch

加入事务提交
BEGIN
INSERT INTO TestBatch VALUES (1,\'aaa\');
INSERT INTO TestBatch VALUES (2,\'bbb\');
commit;
-- Duplicate key error
INSERT INTO TestBatch VALUES (1,\'ccc\');
END;
/

select * from TestBatch

drop table TestBatch

3、自动提交
在SQLPLus中有一个与事务相关的环境变量autocommit,如果这个参数被启用,在SQLPLus中所有修改将在执行时自动提交,启动的方法是在

show autocommit;
update student set height=1;
select * from student;
rollback;
select * from student;

但是此时由于自动提交所以无法回退
set autocommit on;
show autocommit;
update student set height=1;
select * from student;
rollback;
select * from student;

set autocommit off;

注意:Oracle规定事务会在一些操作后自动提交,如DDL语句等。

[此贴子已经被作者于2010-12-11 20:21:44编辑过]