Oracle数据库数据编程SQL<4.2 锁机制>
锁是Oracle数据库用来管理并发访问的重要机制,它确保数据的一致性和完整性。
目录
一、锁的基本概念
1. 锁的作用
2. 锁的特性
二、锁的分类
1. 按锁定资源分类
(1) DML锁(数据锁)
(2) DDL锁(字典锁)
(3) 内部锁和闩(latch)
2. 按并发性分类
(1) 排他锁(X锁)
(2) 共享锁(S锁)
(3) 行共享锁(RS锁)
(4) 行排他锁(RX锁)
三、常见锁模式
四、锁的获取方式
1. 自动获取
2. 手动锁定
五、锁的兼容性矩阵
六、锁的监控
1. 查看锁信息
2. 查看锁等待情况
七、锁的常见问题与解决方案
1. 死锁
特征:
解决方法:
2. 锁等待
解决方法:
八、锁的最佳实践
1. 事务设计:
2. 应用设计:
3. SQL优化:
4. 监控:
九、Oracle锁参数配置
十、特殊锁定场景
1. 分区表锁定
2. LOB数据锁定
3. 索引锁定
一、锁的基本概念
对某个数据进行DML操作后但没有提交或者回滚,另一个窗口对同一数据进行操作时,会一直等待,直到第一个操作被提交或者回滚,且另一个窗口看到的是DML操作之前的镜像。
1. 锁的作用
-
保证数据一致性
-
防止并发事务间的破坏性交互
-
实现事务隔离性
2. 锁的特性
-
排他性:锁定的资源不能被其他事务同时修改
-
持久性:锁会持续到事务结束(提交或回滚)
-
可升级性:某些锁可以升级为更严格的锁
二、锁的分类
1. 按锁定资源分类
(1) DML锁(数据锁)
-
行级锁(TX锁):锁定表中的单行
-
表级锁(TM锁):锁定整个表
(2) DDL锁(字典锁)
-
保护数据字典结构
-
在DDL操作期间自动获取
(3) 内部锁和闩(latch)
-
保护数据库内部结构
-
持续时间极短
2. 按并发性分类
(1) 排他锁(X锁)
-
阻止其他事务获取任何锁
-
用于修改数据的操作(INSERT,UPDATE,DELETE)
(2) 共享锁(S锁)
-
允许多个事务同时读取数据
-
阻止排他锁获取
(3) 行共享锁(RS锁)
-
SELECT...FOR UPDATE使用的锁类型
(4) 行排他锁(RX锁)
-
更新行时自动获取
三、常见锁模式
锁模式 | 简称 | 描述 |
---|---|---|
Row Share | RS | 允许并发访问表,但阻止其他会话锁定整个表进行排他访问 |
Row Exclusive | RX | 允许并发访问表,但阻止其他会话以共享模式锁定表 |
Share | S | 允许并发查询但阻止更新表 |
Share Row Exclusive | SRX | 阻止其他会话以共享模式锁定表或更新表 |
Exclusive | X | 提供对表的完全排他访问 |
四、锁的获取方式
1. 自动获取
Oracle在执行DML语句时自动获取适当的锁:
-
INSERT:获取行级排他锁(RX)
-
UPDATE:获取行级排他锁(RX)
-
DELETE:获取行级排他锁(RX)
-
SELECT:默认不获取锁
-
SELECT...FOR UPDATE:获取行共享锁(RS)
2. 手动锁定
-- 锁定表
LOCK TABLE employees IN EXCLUSIVE MODE;
-- 锁定行
SELECT * FROM employees WHERE employee_id = 100 FOR UPDATE;
五、锁的兼容性矩阵
请求\持有 |