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

Vic*_*tor 10 database oracle oracle11g database-locking

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

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

APC*_*APC 17

我们可以使用LOCK TABLE命令显式发出锁. 了解更多

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

update语句仅锁定受影响的行.除非我们用SELECT ... FOR UPDATE实现了一个悲观的锁定策略. 了解更多.

最后,在Oracle编写器中不会阻止读者.因此,即使锁定的行也可以被其他会话读取,它们只是无法更改. 了解更多.

此行为是在Oracle内核中进行的,并且不可配置.


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


Jus*_*ave 7

这取决于你所说的"锁定".

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

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


小智 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锁.

  • 这是Oracle [文档]的逐字副本(http://docs.oracle.com/cd/E11882_01/server.112/e41084/ap_locks001.htm#SQLRF55502).应该至少归功于原始来源并将其作为报价. (6认同)