删除行并删除表锁oracle

时间:2016-09-07 12:55:39

标签: java oracle oracle11g oracle-sqldeveloper

我有两个查询

1。public class Program { static IConfigurationRoot Config = null; public static void Main(string[] args) { Config = new ConfigurationBuilder() .SetBasePath(Environment.CurrentDirectory) .AddJsonFile("appsettings.json") .AddEnvironmentVariables() .Build(); } }

2。public class TestClass { public void DoSomething() { // Now I need to use that instantiated Config object here. } }

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

假设我们在程序中迭代以下查询

delete from x;

让我们有1,2,3,4号的清单.. 现在如果从2服务器调用相同的程序将1服务器删除1,3 ...而其他服务器将删除2,4 ...?

2 个答案:

答案 0 :(得分:1)

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

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

如果您想了解有关锁的更多信息,请查看Tom Kyte的优秀书籍Expert Oracle DB Architecture。

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

答案 1 :(得分:-1)

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