更新时禁用表上的查询

时间:2016-03-15 14:51:20

标签: 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查询。当table-A和table-B完全更新时,这些查询应该停止并继续执行。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

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

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