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数据库中的事务。