• 14.Oracle中的事务


    一、什么是事务

    Oracle 11g是一个关系型数据库管理系统,它提供了强大的事务管理功能,可以确保数据库操作的一致性、可靠性和持久性。事务是数据库中一组操作的逻辑单元,要么全部执行成功,要么全部不执行,不会出现部分执行的情况。

    在Oracle 11g中,事务具有以下特点:

    1. 原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部不执行。如果事务中的任何一个操作失败,整个事务将被回滚到之前的状态,保持数据库的一致性。

    2. 一致性(Consistency):事务执行前后,数据库的完整性约束和业务规则都得到了保持,数据库从一个一致的状态转移到另一个一致的状态。

    3. 隔离性(Isolation):事务之间相互独立,互不干扰。即使多个事务同时对同一数据进行操作,也不会相互影响。

    4. 持久性(Durability):一旦事务提交,其结果将永久保存在数据库中,即使系统发生故障也不会丢失。

    在Oracle 11g中,可以使用SQL语句来控制事务的提交和回滚,例如使用COMMIT语句提交事务,使用ROLLBACK语句回滚事务。此外,Oracle 11g还提供了事务管理的高级功能,如事务日志、事务恢复和并发控制,以确保数据库的安全性和可靠性。

    总之,Oracle 11g的事务管理功能可以帮助用户确保数据库操作的一致性和可靠性,保护数据库的完整性和安全性。

    二、事务的基本操作

    1、事务的开始与结束

    在执行第一条DML SQL 语句时开始
    在发生下列事件之一后结束:

    1、发出COMMITROLLBACK语句
    2、执行DDL或者DCL语句(事务会自动提交),例如执行CREATE操作
    3、用户退出当前SESSION
    4、系统崩溃(比如说数据库服务器断电、硬件异常造成系统宕机等等)

    一个事务处理结束之后,下一个可执行的SQL语句会自动启动下一个事务处理。
    DDL与DCL语句是自动提交的,因此会隐式的结束一个事务的处理。

    2、事务处理的案例

    2.1题目1

    create table yggz(code int, salary number(7,2));
    insert into yggz values(1, 1000);
    insert into yggz values(2, 150);
    commit;
    
    • 1
    • 2
    • 3
    • 4

    完成任务:
    如果1号员工的salary多于300元,则从1号员工的salary中减少300元,同时加到2号员工的salary上。

    以下是一个简单的PL/SQL程序,用于实现题目中要求的任务:

    DECLARE
      v_salary1 number(7,2);
      v_salary2 number(7,2);
    BEGIN
      -- 获取1号员工的salary
      SELECT salary INTO v_salary1 FROM yggz WHERE code = 1 FOR UPDATE;
      
      -- 判断1号员工的salary是否多于300元
      IF v_salary1 > 300 THEN
        -- 减少1号员工的salary
        UPDATE yggz SET salary = salary - 300 WHERE code = 1;
        
        -- 获取2号员工的salary
        SELECT salary INTO v_salary2 FROM yggz WHERE code = 2 FOR UPDATE;
        
        -- 增加2号员工的salary
        UPDATE yggz SET salary = salary + 300 WHERE code = 2;
        
        -- 提交事务
        COMMIT;
        
        DBMS_OUTPUT.PUT_LINE('任务完成');
      ELSE
        DBMS_OUTPUT.PUT_LINE('1号员工的salary不多于300元,无法完成任务');
      END IF;
    EXCEPTION
      WHEN OTHERS THEN
        -- 出现异常时回滚事务
        ROLLBACK;
        DBMS_OUTPUT.PUT_LINE('任务失败');
    END;
    /
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    在上面的PL/SQL程序中,我们首先获取1号员工的salary,并判断是否多于300元。如果是,则减少1号员工的salary并增加2号员工的salary,然后提交事务。如果出现异常,则回滚事务。最后,根据任务的完成情况输出相应的信息。

    2.2题目2

    create table yggz(code int, salary number(7,2));
    insert into yggz values(1, 1000);
    insert into yggz values(2, 150);
    commit;
    
    • 1
    • 2
    • 3
    • 4

    完成任务:
    如果1号员工的salary多于300元,则从1号员工的salary中减少300元,同时加到2号员工的salary上,但是还要确保转账后的1号员工的salary多于转账后的2号员工的salary。

    以下是一个简单的PL/SQL程序,用于实现题目中要求的任务:

    DECLARE
      v_salary1 number(7,2);
      v_salary2 number(7,2);
    BEGIN
      -- 获取1号员工的salary
      SELECT salary INTO v_salary1 FROM yggz WHERE code = 1 FOR UPDATE;
      
      -- 获取2号员工的salary
      SELECT salary INTO v_salary2 FROM yggz WHERE code = 2 FOR UPDATE;
      
      -- 判断1号员工的salary是否多于300元,且转账后1号员工的salary多于转账后2号员工的salary
      IF v_salary1 > 300 AND (v_salary1 - 300) > (v_salary2 + 300) THEN
        -- 减少1号员工的salary
        UPDATE yggz SET salary = salary - 300 WHERE code = 1;
        
        -- 增加2号员工的salary
        UPDATE yggz SET salary = salary + 300 WHERE code = 2;
        
        -- 提交事务
        COMMIT;
        
        DBMS_OUTPUT.PUT_LINE('任务完成');
      ELSE
        DBMS_OUTPUT.PUT_LINE('1号员工的salary不多于300元,或者转账后1号员工的salary不多于转账后2号员工的salary,无法完成任务');
      END IF;
    EXCEPTION
      WHEN OTHERS THEN
        -- 出现异常时回滚事务
        ROLLBACK;
        DBMS_OUTPUT.PUT_LINE('任务失败');
    END;
    /
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    在上面的PL/SQL程序中,我们首先获取1号员工和2号员工的salary,并判断1号员工的salary是否多于300元,且转账后1号员工的salary多于转账后2号员工的salary。如果条件满足,则执行转账操作,并提交事务。如果出现异常,则回滚事务。最后,根据任务的完成情况输出相应的信息。

    这个PL/SQL程序实现了题目中要求的逻辑,可以在Oracle数据库中执行以完成任务。

  • 相关阅读:
    万字整理 | 深入理解工作队列
    Selenium安装报错:No matching distribution found for selenium。经个人尝试,问题已得到解决
    linux操作系统中的动静态库(未完)
    软考中级软件设计师--考试准备
    更新操作及自动填充
    spring6-提前编译:AOT
    使用Python读取Excel文件:轻松掌握数据操作的秘诀
    基于Python3的scapy解析SSL报文
    【红外图像增强】基于引力和侧向抑制网络的红外图像增强模型(Matlab代码实现)
    Java安全之深入了解SQL注入
  • 原文地址:https://blog.csdn.net/qq_46645079/article/details/134461145