如何暂停存储过程一段时间?

Posted

技术标签:

【中文标题】如何暂停存储过程一段时间?【英文标题】:How to pause a stored procedure for a while? 【发布时间】:2015-12-27 06:25:35 【问题描述】:

我正在使用 Oracle DB 服务器,并且我有一个存储过程,它将由不同的流并行执行。此存储过程使用数据库中的一张表来插入和删除记录。在存储过程中的某个点,我希望它暂停一段时间然后执行。

我可以写什么语句来暂停存储过程一段时间而不锁定它正在使用的表?

Oracle 存储过程中有哪些可用的替代方法来实现这种功能?

我可以使用DBMS_LOCK.SLEEP(seconds) 吗?正如我所说,不同的流程并行使用同一个表,这个DBMS_LOCK.SLEEP(n) 过程会在存储过程暂停时锁定表吗?存储过程处于休眠状态时是否会消耗CPU周期?

除了在 Oracle DB Server 中使用 DBMS_LOCK.SLEEP(n) 过程之外,还有其他替代方法可以实现此功能吗?

【问题讨论】:

试试sleep?澄清您使用的是哪个数据库服务器.. 我正在使用 oracle DB。我不希望存储过程在暂停状态时消耗 cpu 周期,是否可以休眠? 您能否在您的问题中提及……提供所有可能的信息并提供您使用的数据服务器,然后我们可以提供帮助。 暂停的目的是什么?是要同步线程吗? dbms_lock.sleep 不会取出新的锁,但它会不释放已经持有的锁。因此,如果一个人更新了几百行,然后在提交之前休眠,则写锁将在这些行上保持持续时间。 【参考方案1】:

您可以使用DBMS_LOCK.SLEEP(n) 程序。将当前线程的执行停止n 秒的过程。

请注意,DBMS_LOCK 默认不授予 PUBLIC(或其他任何人)。因此,您需要让友好的 DBA 颁发必要的 EXECUTE 权限。

【讨论】:

正如我所说,同一个表被不同的流程并行使用,这个 DBMS_LOCK.SLEEP(n) 过程会锁定存储过程正在使用的表吗?存储过程处于休眠状态时会消耗CPU周期吗? SLEEP 过程不锁定表。它将消耗最少的 CPU。 如果 DBMS_LOCK.SLEEP(seconds) 只需要几秒钟,那么如何让存储过程休眠几微秒? 十毫秒是可能的。 可以在百分之一秒内输入最小增量;例如,1.95 是合法的时间值。 docs.oracle.com/database/121/ARPLS/d_lock.htm#ARPLS66782【参考方案2】:

这听起来像是DBMS_PARALLEL_EXECUTE 包的任务 在此处查看文档DBMS_PARALLEL_EXECUTE

要停止您的处理,您可以使用STOP_TASK https://docs.oracle.com/database/121/ARPLS/d_parallel_ex.htm#ARPLS67379

STOP_TASK Procedure
This procedure stops the task and related job slaves.

Syntax

DBMS_PARALLEL_EXECUTE.STOP_TASK (
   task_name       IN VARCHAR2);
Parameters

【讨论】:

以上是关于如何暂停存储过程一段时间?的主要内容,如果未能解决你的问题,请参考以下文章

我写了一段存储过程 是SQLSERVER的代码如下:

在SQLSERVER里面,如何写一个存储过程来创建跟踪?

查询一段时间内修改过的存储过程

如何使用存储过程在 LINQ to SQL 中使用事务?

如何使用 case 语句来确定存储过程中的 from 和 where 子句?

如何在一段时间内重复一个过程,直到按下输入?