14.Oracle中的事务

oracle的事务管理

  • 一、什么是事务
  • 二、事务的基本操作
    • 1、事务的开始与结束
    • 2、事务处理的案例
      • 2.1题目1
      • 2.2题目2

一、什么是事务

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号员工的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;
/

在上面的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号员工的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;
/

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

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

你可能感兴趣的:(oracle,数据库)