网站首页 > 技术文章 正文
近期分享一下oracle数据库中锁的分类,死锁及其解决方法。
1. 按用户与系统划分,可以分为自动锁与显示锁
a) 自动锁(Automatic Locks):当进行一项数据库操作时,缺省情况下,系统自动为此数据库操作获得所有有必要的锁。自动锁分DML锁,DDL锁,system locks。
b) 显示锁(Manual Data Locks):某些情况下,需要用户显示的锁定数据库操作要用到的数据,才能使数据库操作执行得更好,显示锁是用户为数据库对象设定的。
2. 按锁级别划分,可分为: 排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)
a) 共享锁( S ): 共享锁使一个事务对特定数据库资源进行共享访问——另一事务也可对此资源进行访问或获得相同共享锁。共享锁为事务提供高并发性,但如拙劣的事务设计+共享锁容易造成死锁或数据更新丢失。
b) 排它锁( X): 事务设置排它锁后,该事务单独获得此资源,另一事务不能在此事务提交之前获得相同对象的共享锁或排它锁。
3 按操作划分,可分为DML锁(data locks,数据锁)、DDL锁(data dictionary lock)和 System Locks。
3.1 DML锁
DML锁用于控制并发事务中的数据操纵,保证数据的一致性和完整性。DML 锁主要用于保护并发情况下的数据完整性。 它又分为:
(1)TM锁(表级锁)
(2)TX锁(事务锁或行级锁)
当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。
在数据行上只有X锁(排他锁)。在Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。
当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-600的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。
TM锁(表锁)
当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其它事务进行DDL语句影响记录行的更新。事务也可以在进行过程中获得共享锁或排它锁,只有当事务显示使用LOCK TABLE语 句显示的定义一个排它锁时,事务才会获得表上的排它锁,也可使用LOCK TABLE显示的定义一个表级的共享锁(LOCK TABLE具体用法请参考相关文档)。
TM锁包括了SS、SX、S、X 等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。
TM锁类型表
锁模式
锁描述
解释
SQL操作
0
none
1
NULL
空
Select
2
SS(Row-S)
行级共享锁,其他对象只能查询这些数据行
Select for update、Lock for update、Lock row share
3
SX(Row-X)
行级排它锁,在提交前不允许做DML操作
Insert、Update、 Delete、Lock row share
4
S(Share)
共享锁: 阻止其他DML操作
Create index、Lock share
5
SSX(S/Row-X)
共享行级排它锁:阻止其他事务操作
Lock share row exclusive
6
X(Exclusive)
排它锁:独立访问使用
Alter table、Drop able、Drop index、Truncate table 、Lock exclusive
猜你喜欢
- 2025-07-28 Windows远程桌面出现身份验证错误,由于CredSSP加密数据库修正
- 2025-07-28 MYSQL存储引擎InnoDB(八十):InnoDB静态数据加密
- 2025-07-28 VirtualBox 7.0正式发布:支持完整虚拟主机加密等
- 2025-07-28 C#与NodeJS互相实现DES加密解密(nodejs 加密解密)
- 2025-07-28 Ubuntu系统密码(root密码)的修改方法
- 2024-10-29 #6 SaaS的数据都要做哪些加密处理
- 2024-10-29 Oracle中泄露“天机”的TNS 李阳波泄露了什么天机
- 2024-10-29 浅析Shiro Padding Oracle Attack
- 2024-10-29 Oracle 20c 新特性:表空间缺省加密算法 (最新建议收藏)
- 2024-10-29 Oracle数据库勒索病毒死灰复燃 数据库勒索病毒处理
你 发表评论:
欢迎- 641℃几个Oracle空值处理函数 oracle处理null值的函数
- 631℃Oracle分析函数之Lag和Lead()使用
- 623℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 619℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 615℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 605℃【数据统计分析】详解Oracle分组函数之CUBE
- 596℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 580℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)