【问题标题】: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】:
没问题。您可以删除不存在的记录。但是你不能忘记提交事务。