Oracle是否会在执行DML语句或仅执行行时锁定整个表

时间:2013-08-02 16:04:59

标签: database oracle oracle11g database-locking

当我尝试在db表中插入/更新某些内容时,Oracle会锁定整个表还是仅锁定/更新的行?

这可以通过外部配置控制吗?

4 个答案:

答案 0 :(得分:15)

我们可以使用LOCK TABLE命令显式发出锁。 Find out more

否则,插入不会锁定任何其他行。由于Oracle的读隔离模型,该行只存在于我们的会话中,直到我们提交它为止,因此没有其他人可以对它做任何事情。 Find out more

更新语句仅锁定受影响的行。除非我们用SELECT ... FOR UPDATE实现了一个悲观的锁定策略。 Find out more

最后,Oracle编写者不会阻止读者。因此,即使锁定的行也可以被其他会话读取,它们只是无法更改。 Find out more

此行为已嵌入Oracle内核,无法配置。


Justin对表级DDL锁定提出了一个很好的观点。该锁定将导致在表上执行DDL的会话等待DML会话提交,除非DDL类似于CREATE INDEX,在这种情况下,它将立即使用ORA-00054失败。

答案 1 :(得分:6)

这取决于你所说的“锁定”。

对于人们可能关心的99.9%,Oracle会在修改行时获得行级锁定。行级锁仍然允许读者读取行(由于多版本读取一致性,编写者永远不会阻止读者,读者永远不会进行脏读)。

如果你捅v$lock,你会发现更新一行也会锁定表格。但是该锁只会阻止另一个会话在表上执行DDL。由于您几乎从不想在活动表上首先执行DDL,因此通常不会导致另一个会话等待锁定。

答案 2 :(得分:6)

当执行常规DML(UPDATE / DELETE / INSERT,MERGE和SELECT ... FOR UPDATE)时,oracle获得2个锁。 行级别锁定(TX) - 这将获取正在触摸的特定行的锁定,并且尝试修改同一行的任何其他事务都将被阻止,直到已经拥有它的人完成为止。 表级锁定(TM) - 当获得行锁定(TX)时,还会获得额外的表锁定,以防止在DML正在进行时发生任何DDL操作。

重要的是,在什么模式下获得表锁。 行共享锁(RS)(也称为子共享表锁(SS))指示持有表上锁的事务已锁定表中的行并打算更新它们。 SS锁是表锁最少限制的模式,为表提供最高程度的并发性。

行独占锁(RX),也称为子独占表锁(SX),表示持有锁的事务已更新表行或发出SELECT ... FOR UPDATE。 SX锁允许其他事务在同一个表中同时查询,插入,更新,删除或锁定行。因此,SX锁允许多个事务同时获取同一个表的SX和SS锁。

一个事务持有的共享表锁(S)允许其他事务查询表(不使用SELECT ... FOR UPDATE),但仅当单个事务持有共享表锁时才允许更新。多个事务可能同时持有共享表锁,因此保持此锁定不足以确保事务可以修改表。

共享行独占表锁(SRX),也称为共享 - 子系​​统表锁(SSX),比共享表锁更具限制性。一次只有一个事务可以获取给定表上的SSX锁。事务持有的SSX锁允许其他事务查询表(SELECT ... FOR UPDATE除外)但不更新表。

独占表锁(X)是表锁的最严格模式,允许持有锁的事务对表进行独占写访问。只有一个事务可以为表获取X锁。

答案 3 :(得分:0)

您应该阅读有关锁定的oracle概念手册。 对于标准DML操作(插入,更新,删除,合并),oracle采用共享DML(类型TM)锁。 这允许表上的其他DML同时发生(它是共享锁。) 通过更新或删除DML操作修改但尚未提交的行将具有独占行锁(类型TX)。另一个会话/事务中的另一个DML操作可以在表上运行,但如果它修改了同一行,它将阻塞,直到行锁的持有者通过提交或回滚来释放它。

并行DML操作和串行插入直接加载操作采用独占表锁。