• 【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个事务。

  • 相关阅读:
    [LeetCode] 1160. Find Words That Can Be Formed by Characters
    [LeetCode] 561. Array Partition I
    [LeetCode] 942. DI String Match
    [LeetCode] 852. Peak Index in a Mountain Array
    [LeetCode] 461. Hamming Distance
    [LeetCode] 617. Merge Two Binary Trees
    SSM项目实现连接两个mysql数据库
    springboot导入excel到mysql
    Mysql修改表备注, 列信息
    sql.xml where ids in的写法
  • 原文地址:https://www.cnblogs.com/OliverQin/p/12964296.html
Copyright © 2020-2023  润新知