14.Oracle中的事务

oracle基础系统学习目录

01.CentOS7静默安装oracle11g
02.Oracle的启动过程
03.从简单的sql开始
04.Oracle的体系架构
05.Oracle数据库对象
06.Oracle数据备份与恢复
07.用户和权限管理
08.Oracle的表
09.Oracle表的分区
10.Oracle的同义词与序列
11.Oracle的视图
12.Oracle的索引
13.Oracle通过JDBC连接Java
14.Oracle中的事务
15.Oracle11g的归档方式和日志文件的相关操作
16.Oracle的数据字典和动态性能视图
17.Oracle11g的PL/SQL基础
18.Oracle的过程和函数
19.Oracle11g中的游标
20.Oracle11g中的触发器
21.Oracle的程序包(Package)
22.Oracle中的临时表空间
23.Oracle11g的UNDO表空间
24.Oracle11g的逻辑备份与恢复
25. Oracle的回收站
26.Oracle11g的数据装载
27.Oracle11g的闪回Flashback
28.Oracle11g物化视图


一、什么是事务

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数据库中执行以完成任务。

点击此处跳转下一节:15.Oracle11g的归档方式和日志文件的相关操作

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Juvenile少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值