当前位置: 首页 > news >正文

Oracle数据库数据编程SQL<4.3 事务的补充内容(了解)>

事务是 Oracle 数据库中最基本的工作单元,它代表一组必须全部成功或全部失败的 SQL 语句。下面我将详细讲解 Oracle 中的事务概念、特性、控制和管理。

目录

十、事务锁机制

1. 行级锁:DML操作自动获取

2. 表级锁:DDL操作自动获取

3. 查看锁信息: 

十一、事务与UNDO空间

1. 监控UNDO使用情况:

2. 常见UNDO相关错误: 

十二、自治事务(Autonomous Transactions)

1. 创建自治事务:

2. 特点:

十三、事务恢复

1. 闪回查询:

2. 闪回表:

3. 闪回事务:

十四、分布式事务管理

1. 两阶段提交(2PC):

 2. 处理悬挂事务:

十五、事务性能优化

1. 批量处理减少提交次数:

2. 设置适当的事物隔离级别

3.  使用NOLOGGING选项减少重做日志:

十六、特殊事务场景

1. 只读事务:

2. 延迟约束检查:

3. 并行DML:

十七、事务与PL/SQL

1. 异常处理中的事务控制:

2. 自治事务在触发器中的应用:

十八、事务监控脚本

1. 长时间运行事务查询:

2. 锁定等待链分析:


十、事务锁机制

Oracle通过锁机制实现事务隔离:

1. 行级锁:DML操作自动获取

  • 共享锁(S锁):读取时获取

  • 排他锁(X锁):修改时获取

2. 表级锁:DDL操作自动获取

  • 行共享(RS)

  • 行排他(RX)

  • 共享(S)

  • 排他(X)

  • 共享行排他(SRX)

3. 查看锁信息: 

SELECT * FROM v$lock;
SELECT * FROM dba_blockers;
SELECT * FROM dba_waiters;

十一、事务与UNDO空间

Oracle使用UNDO表空间记录事务修改前的数据:

1. 监控UNDO使用情况:

SELECT tablespace_name, status, sum(bytes)/1024/1024 "Size(MB)"
FROM dba_undo_extents
GROUP BY tablespace_name, status;

2. 常见UNDO相关错误: 

  • ORA-30036:无法扩展UNDO表空间

  • ORA-01555:快照过旧

十二、自治事务(Autonomous Transactions)

自治事务独立于主事务的特殊事务:

1. 创建自治事务:

CREATE OR REPLACE PROCEDURE log_error (p_msg VARCHAR2) AS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  INSERT INTO error_log VALUES (p_msg, SYSDATE);
  COMMIT; -- 必须在自治事务中显式提交或回滚
END;

2. 特点:

  • 独立提交/回滚
  • 不共享锁
  • 能看到主事务已提交的数据

十三、事务恢复

Oracle提供多种恢复机制:

1. 闪回查询:

SELECT * FROM employees AS OF TIMESTAMP SYSTIMESTAMP - INTERVAL '30' MINUTE;

2. 闪回表:

FLASHBACK TABLE employees TO TIMESTAMP SYSTIMESTAMP - INTERVAL '30' MINUTE;

3. 闪回事务:

SELECT * FROM flashback_transaction_query
WHERE table_name = 'EMPLOYEES' AND table_owner = 'HR';

十四、分布式事务管理

1. 两阶段提交(2PC):

  • 准备阶段
  • 提交/回滚阶段

 2. 处理悬挂事务:

SELECT local_tran_id, global_tran_id, state, mixed FROM dba_2pc_pending;
COMMIT FORCE '12.34.567';

十五、事务性能优化

1. 批量处理减少提交次数:

FORALL i IN 1..1000
  INSERT INTO big_table VALUES (data_array(i));
COMMIT;

2. 设置适当的事物隔离级别

ALTER SESSION SET ISOLATION_LEVEL = SERIALIZABLE;

3.  使用NOLOGGING选项减少重做日志:

ALTER TABLE large_table NOLOGGING;
INSERT /*+ APPEND */ INTO large_table SELECT * FROM source_table;
COMMIT;
ALTER TABLE large_table LOGGING;

十六、特殊事务场景

1. 只读事务:

SET TRANSACTION READ ONLY;
SELECT * FROM large_report_table;
COMMIT; -- 不需要,但显式结束事务是好习惯

2. 延迟约束检查:

ALTER SESSION SET CONSTRAINTS = DEFERRED;

3. 并行DML:

ALTER SESSION ENABLE PARALLEL DML;
INSERT /*+ PARALLEL(employees, 4) */ INTO employees SELECT * FROM new_employees;
COMMIT;

十七、事务与PL/SQL

1. 异常处理中的事务控制:

BEGIN
  SAVEPOINT start_transaction;
  -- DML操作
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK TO start_transaction;
    RAISE;
END;

2. 自治事务在触发器中的应用:

CREATE OR REPLACE TRIGGER audit_employee_changes
AFTER INSERT OR UPDATE OR DELETE ON employees
FOR EACH ROW
DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  INSERT INTO audit_log VALUES(:new.employee_id, USER, SYSDATE);
  COMMIT;
END;

十八、事务监控脚本

1. 长时间运行事务查询:

SELECT s.sid, s.serial#, s.username, s.status,
       t.start_time, (SYSDATE - t.start_time)*24*60 "Minutes",
       t.used_ublk, t.used_urec
FROM v$session s, v$transaction t
WHERE s.saddr = t.ses_addr
ORDER BY t.start_time;

2. 锁定等待链分析:

SELECT 
  (SELECT username FROM v$session WHERE sid = h.session_id) blocker,
  h.session_id blocker_sid,
  w.session_id waiter_sid,
  (SELECT username FROM v$session WHERE sid = w.session_id) waiter,
  w.lock_type,
  w.mode_held,
  w.mode_requested
FROM dba_blockers b, dba_lock_internal h, dba_lock_internal w
WHERE h.session_id = b.holding_session
AND w.lock_type = h.lock_type
AND w.mode_requested != 'None'
AND w.mode_requested != h.mode_held
AND w.lock_id1 = h.lock_id1
AND w.lock_id2 = h.lock_id2;

这些补充内容涵盖了Oracle事务的高级特性和实际应用场景,可以帮助您更深入地理解和管理Oracle数据库中的事务。

相关文章:

  • 十、C++速通秘籍—多进程
  • 牛客春招刷题训练营 算法 Java 3月27日 杨辉三角的变形 计算日期到天数转换 而后单调
  • 详细介绍一下Vue3的实现原理?
  • Codecademy—— 交互式编程学习的乐园
  • leetcode215.数组中的第k个最大元素
  • intel-xpu-backend-for-triton绕过pytorch直接调用Unified-Runtime
  • 小程序31-wxml语法-setData() 修改数据
  • RTC实时时钟M41T11M6F国产替代FRTC4111S
  • vue3如何批量设置每个vue页面的defineOptions的name
  • Web Workers 技术解析与应用
  • # 基于 OpenCV 的人脸识别实战:从基础到进阶
  • 贪心进阶学习笔记
  • Elasticsearch简介及索引库操作
  • 全新开源PHP轻量级活码管理系统|支持二维码动态更新与自动失效机制
  • 【力扣hot100题】(064)在排序数组中查找元素的第一个和最后一个位置
  • 【Tauri2】015——前端的事件、方法和invoke函数
  • Docker常用操作教程
  • java发送http请求
  • 数字化转型:重构生存逻辑,不止系统升级
  • AI面试实践手册|牛客网
  • 做付费网站/国外搜索引擎大全
  • 网站维护推广/推广优化网站排名教程
  • png图片可以做网站图标吗/网络营销策划案
  • 天津网站建设wangzhii/链爱交易平台
  • 无锡优化网站价格/今日广东头条新闻
  • 广告设计作品图片/百度搜索关键词排名优化技术