发布网友 发布时间:2023-07-29 02:58
共1个回答
热心网友 时间:2024-12-04 12:21
我对文章中意向锁的理解 就是 对表的记录进行操作之前 先对表定义(包括表结构 约束等)加了共享锁 这是为了避免对表的DDL操作
比如 当你往TAB 插入一条记录时 该表的一个字段COL 是允许为空的 插入这条记录的该字段的值是空的 此时 若不对该表定义加共享锁 则另外一SESSION对TAB COL 加非空约束 那该表结构修改就与插入的记录发生冲突了 所以 当执行DML操作是 必定对操作的表加DDL共享锁
这是我理解的意向锁
文章中提及 记录行是无共享锁 我对此观点表示不同 当插入/修改子表时 对应的父表的主键记录应该被加共享锁 因为此时要保证父键的存在 经测试 当插入/修改/删除子表时 父表确实被加了SS锁 此时可以对父表的主键做插入动作 但不允许做修改/删除 这符合逻辑 因为插入操作并不影响主外键的关系 但删除/修改则可能
SHARE VS ROW SHARE有什么区别?
我猜想 ROW SHARE是(级别= )对表加表定义共享锁 SHARE(级别= )是对表定义及表 所有 的记录加共享锁 但这样就有问题 SELECT FOR UPDATE产生TM= 对查询出来的记录产生TX= 的锁 那这样应该与 表 所有 的记录加共享锁 相冲突了?但实际并不是 实际上 当对表加SHARE锁时 还是可以对该表执行 SELECT FOR UPDATE 但却不可以执行DML操作!
现我只能这样理解 虽然产生了TX= 的事务锁 但实际上 还并没有真正修改记录 和真正的INSERT UPDATE DELETE 操作还是有区别的 也就是 SELECT FOR UPDATE这个锁有点特别 对加了共享锁的记录 还可以SELECT FOR UPDATE 但若想执行DML语句 则不可以 因为该表的 所有 记录都加了共享锁
若照第 点的理解 那SRX就是对表加共享锁 对表的所有记录加排它锁 这是我的猜测 不知道在什么地方会使用上这种锁
总结 查看了ORACLE的文档 其并不解释如何定义的各级别的锁 为什么会这样定义 理由 用途何在?现在我想使用各类型锁 来对ORACLE锁的各级别定义说明
无
NULL 可以某些情况下 如分布式数据库的查询会产生此锁
SS 表结构共享锁
SX 表结构共享锁+ *** 作的记录的排它锁
S 表结构共享锁+所有记录共享锁
SRX 表结构共享锁+所有记录排它锁
X 表结构排它锁+所有记录排它锁
lishixin/Article/program/Oracle/201311/18652