`
zdk2116
  • 浏览: 10949 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

oracle 锁

阅读更多

一直以来对oracle的锁都没搞清楚,这次借考OCA的机会弄了一下。

  

 实验如下(以下的结果是在oracle10g上测试的):

 1.insert  语句

     会话1--->

        insert into p(x) values(8); //表p就一个字段,number类型

        select * from v$lock where (type = 'TM' or type = 'TX') and sid = userenv('SID');

        (假设系统只有该用户)查询结果为:

        P表被锁住了,LMODE 3(TM锁:行排他锁),还有一个TX锁(LMODE=6)

     会话2--->

        如果这个时候另外一个用户登录,企图删除这个表:

        drop table user1.p;

        立刻抛出ora-00054的错误。

        如果插入同样的数据,则被阻塞,直到上个用户提交或者回滚

2.update  语句

    如果p表没有被c表作为外键关联,则和insert语句产生的锁是一样的。

    下面我们来看一下有外键关系的情况:

    假设现在有个c表关联了p表,p表的主键是c表的外键。假设现在c表有2条数据,对应p表的2条数据,p表6条数据。

    会话1--->

       update p set x=10 where x = 3;//假设该主键未被c表引用

       此时如果表c的外键没有索引,则c表不会被锁柱,否则c表被锁住了(LMODE=2:行共享锁)。为什么

       有了索引反而会锁住的呢?这个我也没搞明白。

       

       还有一种情况,如果我先往c表插入一条数据:

       insert into c(x) values(3);

 

     会话2--->

       delete from p where p.x = 6;

 

       这时候这个会话被阻塞,因为它要对c表加个LMODE=4的共享锁,但会话1已经对它进行行共享锁了。

       这个也是oracle产生死锁的主要原因(外键没有索引) 。如果我们在c表的外键加个索引,看看什么情况:

       delete from p where p.x = 6;

       0 rows deleted

       很明显,这个时候不会试图锁住c表。

       从上面的例子可以看出,删除主表的数据的时候(执行该DML语句的期间),如果子表外键没有索引,

       则会锁住子表(LMODE=4:共享锁)。

 

       ----------------------------------------------------------------------------------------------------------------   

                                                                         Lock  Lock Modes Permitted?  
SQL                        Mode  RS RX S  SRX X  
SELECT                           Y  Y  Y  Y  Y 
INSERT                       RX  Y  Y  N  N  N  
UPDATE                       RX  Y* Y* N  N  N 
DELETE                       RX  Y* Y* N  N  N 
SELECT.. FOR UPDATE OF..     RS  Y* Y* Y* Y* N 
LOCK TABLE <table_name> 
 IN ROW SHARE MODE           RS  Y  Y  Y  Y  N 
 IN ROW EXCLUSIVE MODE       RX  Y  Y  N  N  N 
 IN SHARE MODE               S   Y  N  Y  N  N 
 IN SHARE ROW EXCLUSIVE MODE SRX Y  N  N  N  N 
 IN EXCLUSIVE MODE           X   N  N  N  N  N  
 
RS: row share RX: row exclusive S: share 
SRX: share row exclusive X: exclusive  
 
* Waits if another transaction has a lock  

        -------------------------------------------------------------------------------------------------------------

       以上这段摘在oracle_locking文件,这里的S锁和SRX主要有什么区别呢?

       1.一个事务锁住A表(S锁)之后,其他事务也能对该表进行S锁,当且仅当只有自己对该表有S锁时候才能

          修改该表的数据。如果有多个事务都有该表的S锁,那谁都不能修改数据。只能等待其他事务结束。

       2.一个事务锁住A表(SRX锁)之后,其他事务不能再对它进行SRX锁,只有自己才能更新数据。

分享到:
评论

相关推荐

    oracle解锁,死锁

    在深入讨论Oracle解锁和死锁之前,我们首先需要了解Oracle数据库中的锁机制。 1. **共享锁(S)**:允许多个用户读取行,但不允许修改。 2. **排他锁(X)**:允许单个用户修改行,其他用户只能等待。 3. **共享更新锁...

    oracle锁表处理

    ### Oracle锁表处理 在Oracle数据库管理中,锁机制是一种重要的资源管理手段,用于控制并发事务对数据资源的访问,防止多个用户同时修改相同的数据,从而确保数据的一致性和完整性。然而,在高并发环境下,锁的争用...

    Oracle 锁机制问题详解

    ### Oracle 锁机制问题详解 #### 一、引言 在多用户数据库环境中,当多个用户尝试同时访问或修改同一份数据时,就需要通过锁机制来确保数据的一致性和完整性。Oracle 数据库提供了多种类型的锁来支持事务隔离级别,...

    oracle锁表查询oracle锁表查询oracle锁表查询

    ### Oracle锁表查询详解 #### 一、Oracle锁机制简介 在Oracle数据库中,锁是一种重要的并发控制机制,用于管理多个用户对同一数据资源的访问。通过锁机制,Oracle能够确保数据的一致性和完整性,避免多用户操作时...

    oracle解锁语句.txt

    oracle解锁语句,常用解锁语句,经过测试实用;oracle解锁语句,常用解锁语句,经过测试实用。

    ORACLE解锁方法的一点资料

    在Oracle数据库管理中,锁机制是用于控制并发访问的重要手段之一。然而,在某些情况下,不当的锁可能会导致性能问题甚至系统故障,因此掌握如何解锁变得至关重要。本文将详细介绍Oracle解锁方法的相关知识点,包括...

    oracle锁表和解锁语句示例.sql

    oracle锁表和解锁语句示例。

    oracle锁机制探讨

    在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁(用来保证表的结构不被用户修改),TX锁称为事务锁或行级锁。当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统...

    Oracle锁 图例

    本文将深入探讨Oracle锁的类型、工作原理以及相关的管理工具。 一、Oracle锁的类型 1. 表级锁:Oracle中的表级锁主要有两种,即排他锁(Exclusive Locks, X locks)和共享锁(Shared Locks, S locks)。排他锁允许...

    查看Oracle锁表

    ### 查看Oracle锁表 在Oracle数据库管理过程中,锁定机制是一项重要的功能,它用于确保数据的一致性和事务处理的安全性。当多个用户试图同时访问同一数据时,可能会出现并发问题,这时就需要通过锁定来控制对数据的...

    oracle锁表及解锁

    ### Oracle锁表与解锁详解 在Oracle数据库管理中,锁是一种关键机制,用于控制多个用户对数据资源的并发访问,防止数据冲突和不一致。本文将深入探讨Oracle中检查锁表的方法以及如何对表进行解锁。 #### Oracle锁...

    oracle锁表后,如何解锁

    Oracle锁表后如何解锁 Oracle锁表是指在Oracle数据库中某个表被锁定,无法进行操作的情况。这种情况经常发生在多用户同时访问同一个表时,某个用户锁定了该表,导致其他用户无法访问该表。那么,在不知道谁锁的情况...

    快速查找oracle锁对象

    在Oracle数据库管理中,"快速查找Oracle锁对象"是一个关键任务,特别是在处理并发事务和解决性能问题时。当多个用户或进程同时访问同一资源时,可能会出现锁冲突,导致某些事务等待,影响数据库的正常运行。了解如何...

    oracle锁表解决

    ### Oracle锁表解决 在Oracle数据库管理中,锁表是一个常见的问题,特别是在高并发的应用场景下。当一个表被锁定时,其他用户或进程可能无法访问该表,从而导致应用程序出现延迟或者错误。因此,了解如何有效地解锁...

    oracle锁表sql

    oracle 查看锁表sql 及如何解锁,多给点分,为了下载别的资料。大家相互学习相互进步

    ORACLE锁深入分析

    Oracle锁是数据库并发控制的关键机制,它确保了在多用户环境下数据的一致性和完整性。当多个用户并发地访问和操作数据库中的数据时,如果没有适当的控制,可能会导致数据的不一致性和冲突。为了解决这个问题,Oracle...

    oracle 解锁表

    oracle 解锁表,可以用此字句,对表进行解锁,但是要有相应的权限

Global site tag (gtag.js) - Google Analytics