一直以来对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数据库中的锁机制。 1. **共享锁(S)**:允许多个用户读取行,但不允许修改。 2. **排他锁(X)**:允许单个用户修改行,其他用户只能等待。 3. **共享更新锁...
### Oracle锁表处理 在Oracle数据库管理中,锁机制是一种重要的资源管理手段,用于控制并发事务对数据资源的访问,防止多个用户同时修改相同的数据,从而确保数据的一致性和完整性。然而,在高并发环境下,锁的争用...
### Oracle 锁机制问题详解 #### 一、引言 在多用户数据库环境中,当多个用户尝试同时访问或修改同一份数据时,就需要通过锁机制来确保数据的一致性和完整性。Oracle 数据库提供了多种类型的锁来支持事务隔离级别,...
### Oracle锁表查询详解 #### 一、Oracle锁机制简介 在Oracle数据库中,锁是一种重要的并发控制机制,用于管理多个用户对同一数据资源的访问。通过锁机制,Oracle能够确保数据的一致性和完整性,避免多用户操作时...
oracle解锁语句,常用解锁语句,经过测试实用;oracle解锁语句,常用解锁语句,经过测试实用。
在Oracle数据库管理中,锁机制是用于控制并发访问的重要手段之一。然而,在某些情况下,不当的锁可能会导致性能问题甚至系统故障,因此掌握如何解锁变得至关重要。本文将详细介绍Oracle解锁方法的相关知识点,包括...
oracle锁表和解锁语句示例。
在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁(用来保证表的结构不被用户修改),TX锁称为事务锁或行级锁。当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统...
本文将深入探讨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 查看锁表sql 及如何解锁,多给点分,为了下载别的资料。大家相互学习相互进步
Oracle锁是数据库并发控制的关键机制,它确保了在多用户环境下数据的一致性和完整性。当多个用户并发地访问和操作数据库中的数据时,如果没有适当的控制,可能会导致数据的不一致性和冲突。为了解决这个问题,Oracle...
oracle 解锁表,可以用此字句,对表进行解锁,但是要有相应的权限