Oracle中的事务管理命令
set autocommit=off 取消自动提交处理,开启事务处理
set autocommit=on 打开自动提交处理,关闭事务处理
commit 提交事务
rollback to[回滚点] 回滚操作
savepoint 事务保存点名称 设置事务保存点
在Oracle数据库中,每个连接到此数据库的用户都是一个session,每个session都拥有独立的事务,不同的session事务是完全隔离的;
事务操作的基本形式
1. 打开两个sqlplus,表示两个session,使用同一个账号登陆即可;
示例:
第一个sqlplus执行以下语句:DELETE FROM myemp WHEREMONTHS_BETWEEN(sysdate,hiredate)/12>32 ;
第一个sqlplus窗口执行以下的数据库查询操作
SELECT empno,ename,hiredate,job,sal FROM myemp ;
可以发现数据已经删除
2. 第二个sqlplus窗口执行以下的数据库查询操作,会发现数据并没有删除
这就是事务操作造成的。对每个session而言,每个数据库的更新操作在事务没有被提交之前都只是暂时保存在一段缓冲区中,并不会真正向数据库中发出命令,如果用户发现操作有问题,则可以进行事务的回滚
SELECT empno,ename,hiredate,job,sal FROM myemp ;
3. 在第一个sqlplus窗口中使用ROLLBACK回滚事务
ROLLBACK ;
当事务回滚完成之后,再次查询myemp表中的相关数据,会发现数据恢复了
SELECT empno,ename,hiredate,job,sal FROM myemp ;
4. 可以通过提交事务,让删除操作起作用
DELETE FROM myemp WHERE MONTHS_BETWEEN(sysdate,hiredate)/12>32 ;
COMMIT ;
5. 事务提交后,通过第二个sqlplus窗口查看删除后的myemp表内容
SELECT empno,ename,hiredate,job,sal FROM myemp ;
默认,执行rollback意味着全部的操作都要回滚,要回滚到指定的操作,可以采用savepoint设置一些保存点,在回滚的时候,就可以通过rollback返回指定的保存点上,savepoint
设置多个更新操作
--插入数据:
insert into myemp(empno,ename,hiredate,job,sal) values(1234,'hey',to_date('1988-05-29','yyyy-mm-dd'),'经理',3000);
--更新数据:
update myemp set sal = 5000 where empno=1234;
--设置存储点A:
SAVEPOINT sp_a;
--插入数据:
insert into myemp(empno,ename,hiredate,job,sal) values(5678,'yang',to_date('1989-11-11','yyyy-mm-dd'),'人事',2000);
--更新数据:
update myemp set job = '总监' where empno = 5678;
--设置存储点B:
SAVEPOINT sp_b;
--删除全部数据:
delete from myemp;
--执行以上的命令之后,会设置两个存储点,sp_a,sp_b;
--查询myemp表的数据,会找不到任何数据
SELECT empno,ename,hiredate,job,sal FROM myemp ;
--下面使用sp_b保存点,回滚
ROLLBACK TO sp_b ;
--再次查询
SELECT empno,ename,hiredate,job,sal FROM myemp ;
--再将事务回滚到sp_a
ROLLBACK TO sp_a ;
--再次查询此表查看变化;
设置事务自动提交
1. 通过设置存储点回滚比较麻烦,通过如下命令设置事务的自动提交
2. 将事务设置成自动提交,语法:
SET AUTOCOMMIT [ON | OFF];
设置事务自动提交:SET AUTOCOMMIT ON ;