数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

我对ORACLE数据锁的一点体会


发布日期:2023年12月06日
 
我对ORACLE数据锁的一点体会

我对文章中意向锁的理解就是对表的记录进行操作之前先对表定义(包括表结构约束等)加了共享锁这是为了避免对表的DDL操作

比如当你往TAB插入一条记录时该表的一个字段COL是允许为空的插入这条记录的该字段的值是空的此时若不对该表定义加共享锁则另外一SESSION对TABCOL加非空约束那该表结构修改就与插入的记录发生沖突了所以当执行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 表结构排它锁+所有记录排它锁

其中 SELECT FOR UPDATE是比较特殊的一种情况由于其不修改记录所以对这些记录而言并未产生真正的排它锁这与DML操作产生的排它锁相比是有差别的但由于不允许在这些记录加SELECT FOR UPDATE所以也不是纯粹的共享锁我认为其是介于共享锁和排它锁之间的一种特殊的情况因此ORACLE在对表加了S锁后还允许对该表执行SELCT FOR UPDATE但实际上此时此语句已经无意义了因为加了S锁的表不允许DML操作此语句于普通的SELECT 语句无差别

上一篇:Sql语句解析过程

下一篇:使用OracleODP.NET11g的.NET程序发布方法