目录



1.理论部分

事务会把表示工作逻辑单元的SQL语句集成起来。

(1)commit

当数据库提交COMMIT语句的时候,这个事务就结束了,并且如下结果会发生:

  • 事务所做的所有工作都会永久化
  • 其他用户可以看到这个事务所做的数据变更
  • 该事务拥有的所有锁被释放

commit语句的语法如下:

​COMMIT [WORK];​

(2)rollback

当ROLLBACK语句提交到数据库时,这个事务就结束了,并且会出现以下结果:

  • 该事务所做的所有工作都被撤销,就像没有执行过这个事务一样。
  • 该事务拥有的所有锁被释放

rollback语句的语法如下:

​ROLLBACK [WORK];​

(3)savepoint

使用savepoint命令,可以实现只有事务的部分工作被撤销。

savepoint语句的语法如下:

​SAVEPOINT name;​

一般配合rollback语句来使用,语法如下:

​ROLLBACK [wowk] to SAVEPOINT name;​

当ROLLBACK to SAVEPOINT name提交到数据库时,就会出现如下结果:

  • 从SAVEPOINT起所有工作被撤销。但是,SAVEPOINT仍然是活跃的,直到执行完COMMIT或者是ROLLBACK,在需要的时候,可以再次回滚。
  • 从SAVEPOINT以来SQL语句所拥有的的所有锁和资源被释放。
  • 事务没结束,因为SQL语句还没有最终结束。

2.事务案例1

create table cust_info(id number,name Varchar2(40) ,constraint p_cust_info primary key(id));
insert into cust_info values(1,'Jack');
insert into cust_info values(2,'Logan');
insert into cust_info values(3,'Oliver');
commit;

declare
begin
insert into cust_info values(5,'张三');
SAVEPOINT A;
insert into cust_info values(6,'李四');
SAVEPOINT B;
insert into cust_info values(7,'王五');
SAVEPOINT C;
insert into cust_info values(8,'周六');
SAVEPOINT D;
ROLLBACK TO SAVEPOINT B;
end;


当执行完上述的PL/SQL语句后,再执行

select * from cust_info


我们可以看到只存在id为5,6的两条记录。

3.事务案例2

DECLARE 
v_Counter NUMBER;
BEGIN
v_Counter := 0;
for i IN 1..100
LOOP
v_Counter := v_Counter + 1;
IF v_Counter = 10
THEN
COMMIT;
dbms_output.put_line(v_Counter);
v_Counter := 0;
END IF;
END LOOP;
END;


上述案例的执行结果是:

10

10

10

10

10

10

10

10

10

10

表示整个PL/SQL块中有10个事务。


作者:奔跑的金鱼