【问题标题】:Delete row and delete table lock oracle删除行删除表锁oracle
【发布时间】:2017-01-15 04:22:57
【问题描述】:

我有两个查询

1.delete from x;

2.delete from x where y='a'

oracle 11g 为上述查询提供什么类型的锁?

假设我们在一个程序中迭代下面的查询

delete from x where y='$a'

让一个有数字 1,2,3,4 的列表.. 现在如果从 2 个服务器调用相同的程序,1 个服务器会删除 1,3... 而其他服务器会删除 2,4...?

【问题讨论】:

标签: java oracle oracle11g oracle-sqldeveloper


【解决方案1】:

1) 由于没有 where 子句,因此该用户会话的表中的所有行都将被锁定。 2) 只有那些匹配 where 子句的行才会被锁定。 Oracle 通过在该行的数据块中设置一个锁定位来使用行级锁定。

除非并且直到发出提交 - 其他会话都不会看到这些删除。 Oracle 将使用回滚信息——为每个单独的删除(或任何 DML 操作)语句创建,以向任何其他会话提供读取一致的视图。含义:其他会话将看到表没有删除。一旦行被锁定 - 其他会话将被阻止对这些行发出删除,并且用户将被阻止,等待这些行被提交或回滚。您可以使用两个 sqlplus 会话对此进行测试。

如果您想了解更多关于锁的信息,请查看 Tom Kyte 的优秀著作《Expert Oracle DB Architecture》。

是的,两个不同的会话可以删除不同的集合行。默认情况下,Oracle 不进行全表锁定(它会在 DML 期间锁定表以防止在更改未决时对该表进行结构更改),因此一个会话不会阻塞另一个会话。

【讨论】:

    【解决方案2】:

    没问题。您可以删除不存在的记录。但是你不能忘记提交事务。

    【讨论】:

      猜你喜欢
      • 2012-11-30
      • 2018-02-20
      • 2011-04-11
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多