Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 更新时禁用表上的查询_Oracle_Plsql - Fatal编程技术网

Oracle 更新时禁用表上的查询

Oracle 更新时禁用表上的查询,oracle,plsql,Oracle,Plsql,我有一个pl/sql脚本,它清除(通过delete from语句)并填充几个依赖表,如下所示: delete from table-A insert into table-A values(...) delete from table-B insert into table-B values(...) 这些操作需要大约10秒钟才能完成,我想在表更新时停止所有试图从表A或表B读取数据的sql查询。当表A和表B完全更新时,这些查询应该停止并继续执行 正确的方法是什么?正如其他人所指出的,Oracl

我有一个pl/sql脚本,它清除(通过
delete from
语句)并填充几个依赖表,如下所示:

delete from table-A
insert into table-A values(...)
delete from table-B
insert into table-B values(...)
这些操作需要大约10秒钟才能完成,我想在表更新时停止所有试图从表A或表B读取数据的sql查询。当表A和表B完全更新时,这些查询应该停止并继续执行


正确的方法是什么?

正如其他人所指出的,Oracle的基本并发模型是编写器不阻止读卡器,读卡器也不阻止编写器。您无法停止运行简单的
select
。您的查询将看到他们开始执行的SCN的数据(假设您使用的是默认的
read committed
transaction隔离级别),因此在您的更新开始之前,他们将有一个一致的数据视图


您可以使用获取自定义命名锁。您需要在运行更新之前获取该锁,查询表的每个会话也需要在开始查询表之前获取该锁。显然,这会降低应用程序的可伸缩性,但它会满足您的要求。据推测,执行查询的会话可以在共享模式下获取锁,而执行更新的会话需要在独占模式下获取锁。

为什么要这样做?只要delete/insert在事务中(它们之间没有提交),用户就看不到“between”状态。如果这是您想要防止的,Oracle中没有脏读。阻止任何人读取表的唯一方法是撤销他们对该表的选择权限。正如@FlorinGhita所说,没有必要这么做。