【Oracle】PL/SQL块中使用事务
目录
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个事务。
相关推荐
spurity 2020-11-10
LeeLuffy 2020-10-16
DriveCar 2020-09-07
zjuwangleicn 2020-09-04
quniMdejiangyou 2020-08-15
gamestart0 2020-08-15
loviezhang 2020-08-08
gaozhennan 2020-08-03
mcvsyy 2020-08-02
happinessaflower 2020-07-29
花落花开春去秋来 2020-07-29
heniancheng 2020-07-26
牧场SZShepherd 2020-07-20
jakefei 2020-07-19
牧场SZShepherd 2020-07-19
qingjiuquan 2020-07-18
云之飞踢 2020-07-08
zhanbuquan 2020-07-04