`

Oracle的dbms_lock包的相关知识

阅读更多
DBMS_LOCK授权
revoke execute on dbms_lock from apps;
grant execute on dbms_lock to apps;

将DBMS_LOCK包授权给USER:APPS.

相关操作:
-- create demo table

CREATE TABLE lock_test (
action VARCHAR2(10),
when   TIMESTAMP(9));

GRANT insert ON lock_test TO public;

CREATE OR REPLACE PACKAGE lock_demo IS
v_lockname   VARCHAR2(12) := 'control_lock';
v_lockhandle VARCHAR2(200);
v_result     PLS_INTEGER;

-- obtain a lock
PROCEDURE request_lock(p_ltype INTEGER, p_retval OUT INTEGER);
-- release an existing lock
PROCEDURE release_lock(p_retval OUT INTEGER);
-- view the stored handle
FUNCTION see_handle RETURN VARCHAR2;
-- decode lock request
FUNCTION decode_req(p_result PLS_INTEGER) RETURN VARCHAR2;
-- decode lock release
FUNCTION decode_rel(p_result PLS_INTEGER) RETURN VARCHAR2;

END lock_demo;
/


CREATE OR REPLACE PACKAGE BODY lock_demo IS

PROCEDURE request_lock(p_ltype IN INTEGER, p_retval OUT INTEGER) IS
BEGIN
IF v_lockhandle IS NULL THEN
   dbms_lock.allocate_unique(v_lockname, v_lockhandle);
    p_retval :=dbms_lock.request(v_lockhandle, p_ltype);
END IF;
END request_lock;
------------------------------------------------------------
PROCEDURE release_lock(p_retval OUT INTEGER) IS
BEGIN
IF v_lockhandle IS NOT NULL THEN
    p_retval :=dbms_lock.release(v_lockhandle);
END IF;
END release_lock;
------------------------------------------------------------
FUNCTION see_handle RETURN VARCHAR2 IS
BEGIN
IF v_lockhandle IS NOT NULL THEN
    RETURN v_lockhandle;
ELSE
    RETURN 'Not Allocated';
END IF;
END see_handle;
------------------------------------------------------------
FUNCTION decode_req(p_result PLS_INTEGER) RETURN VARCHAR2 IS
retval VARCHAR2(20);
BEGIN
SELECT DECODE(p_result,0,'Success',1,'Timeout',2,'Deadlock',
3,'Parameter Error',4,'Already owned',5,'Illegal Lock Handle')
INTO retval
FROM dual;

RETURN retval;
END decode_req;
------------------------------------------------------------
FUNCTION decode_rel(p_result PLS_INTEGER) RETURN VARCHAR2 IS
retval VARCHAR2(20);
BEGIN
SELECT DECODE(p_result,0,3, 'Parameter Error',4, 'Already owned',
5, 'Illegal Lock Handle')
INTO retval
FROM dual;

RETURN retval;
END decode_rel;
------------------------------------------------------------
END lock_demo;
/

GRANT execute ON lock_demo TO public;


set serveroutput on

-- get an exclusive lock in the current session (Session 1)
DECLARE
s VARCHAR2(200);
BEGIN
lock_demo.request_lock(6, s);
dbms_output.put_line(s);
END;
/

/* Two session request a shared lock (ss_mode). The shared lock cannot be acquired because session 1 holds an exclusive lock. Execution will stop on the request until the the exclusive lock is released. */
session2
set serveroutput on

DECLARE
s VARCHAR2(200);
BEGIN
uwclass.lock_demo.request_lock(
dbms_lock.ss_mode, s);

dbms_output.put_line(s);

INSERT INTO uwclass.lock_test
(action, when)
VALUES
('started', SYSTIMESTAMP);

dbms_lock.sleep(5);

INSERT INTO uwclass.lock_test
(action, when)
VALUES
('ended', SYSTIMESTAMP);
COMMIT;
END;
/

session 3
set serveroutput on

DECLARE
s VARCHAR2(200);
BEGIN
uwclass.lock_demo.request_lock(
dbms_lock.ss_mode, s);

dbms_output.put_line(s);

INSERT INTO uwclass.lock_test
(action, when)
VALUES
('started', SYSTIMESTAMP);

dbms_lock.sleep(5);

INSERT INTO uwclass.lock_test
(action, when)
VALUES
('ended' , SYSTIMESTAMP);
COMMIT;
END;
/

-- Session 1 releases its lock
DECLARE
s VARCHAR2(200);
BEGIN
lock_demo.release_lock(s);
dbms_output.put_line(s);
END;
/

-- Execution resumes when the exclusive lock is released
SELECT TO_CHAR(when,'dd.mm.yyyy hh24:mi:ss'), action
FROM lock_test
ORDER BY when;
分享到:
评论

相关推荐

    dbms_lock控制串行详解

    DBMS_LOCK是Oracle数据库系统中的一个内置包,用于在用户会话之间实现锁的管理,以确保并发操作的安全性和数据一致性。这篇博文深入探讨了DBMS_LOCK的功能、使用方法以及在实际应用中的重要性。 首先,我们要理解...

    ORACLE DBMS STATS ERROR

    然而,当出现错误“ORA-04063: package body 'SYS.DBMS_REGISTRY_SYS' has errors”时,表明`DBMS_STATS`包或与其相关的`SYS.DBMS_REGISTRY_SYS`包体存在错误,这可能对数据库性能和正常操作造成影响。 **问题症状*...

    ORACLE的存储过程的异步调用

    为了使用特定的程序包,需要授予用户系统权限,例如执行 DBMS_PIPE、DBMS_LOCK 和 DBMS_JOB 等权限。 知识点 9: 建立测试环境 为了测试异步调用存储过程的方法,需要建立测试环境,包括创建模拟大业务处理存储过程...

    DBMS_REDEFINITION

    在使用 DBMS_REDEFINITION 包时,需要注意执行权限,需要拥有 EXECUTE_CATALOG_ROLE 角色、CREATE ANY TABLE 权限、ALTER ANY TABLE 权限、DROP ANY TABLE 权限、LOCK ANY TABLE 权限、SELECT ANY TABLE 权限。...

    Oracle内置包_reference

    以上只是Oracle内置包的一部分,实际上,Oracle还提供了许多其他的包,如DBMS_OUTPUT、DBMS_METADATA等,它们构成了Oracle数据库强大的功能集合,为开发人员提供了丰富的工具来处理各种数据库任务。掌握这些内置包的...

    Oracle PL/SQL常用47个工具包

    5. **DBMS_LOCK**: 提供锁定机制,确保并发操作时的数据一致性。 6. **DBMS_METADATA**: 用于获取数据库对象的元数据,如表、视图、索引等的DDL定义。 7. **DBMS_JOB**: 计划和调度任务,可以定期运行指定的PL/SQL...

    Oracle内置包_reference.rar

    PL/SQL包是由一系列PL/SQL过程和函数组成的,而SQL包则包含SQL相关的功能。 1. **DBMS_UTILITY** - 这个包提供了各种实用工具,如分析SQL语句的性能、格式化输出、获取数据库版本信息等。例如,`DBMS_UTILITY....

    彻底搞清楚library cache lock的成因和解决方法

    - 使用 Oracle 提供的 `DBMS_LOCK` 包可以在修改 SQL 或 PL/SQL 对象之前获得锁,从而避免不必要的等待。例如: ```sql DECLARE l_lock_id NUMBER; BEGIN -- 尝试获取锁 DBMS_LOCK.REQUEST( lock_id => l_...

    DM7_System_Packages.pdf

    DBMS_LOCK包提供了数据库锁定相关的方法,包括请求和释放锁。这些方法有助于管理并发操作,防止多个用户同时对同一数据进行修改导致的数据不一致性问题。 #### DBMSLOB DBMSLOB包提供了对大型对象(LOBs)的管理...

    DM7系统包使用手册

    本文档旨在详细介绍达梦数据库(DM)中特有的DMGEO系统包以及兼容Oracle数据库的一系列系统包,包括DBMS_ALERT、DBMS_OUTPUT、UTL_FILE和UTL_MAIL等。这些系统包提供了丰富的功能,帮助开发人员、测试工程师、技术...

    Oracle内置包的使用方法.rar

    Oracle数据库系统提供了丰富的内置包,这些包包含了大量预定义的函数和过程,为数据库管理员和开发者提供了极大的便利。本文将详细介绍Oracle内置包的使用方法,包括它们的功能、调用方式以及示例应用。 1. **DBMS_...

    oracle-lock

    - Oracle提供了一个PL/SQL包DBMS_LOCK,用于在PL/SQL环境中显式地创建和管理锁。例如,你可以使用`DBMS_LOCK.ALLOCATE_UNIQUE`分配一个锁,然后使用`DBMS_LOCK.REQUEST`请求锁,最后用`DBMS_LOCK.RELEASE`释放锁。 ...

    Oracle内置包的使用方法

    DBMS_LOCK则是处理锁定问题的包,它提供了各种锁定机制,如申请、释放和等待锁,以确保多用户环境下的数据一致性。 此外,还有DBMS_JOB和DBMS_SCHEDULER这两个包,它们用于计划和执行数据库任务。DBMS_JOB更适合...

    Oralce11g数据库常见内置程序包

    1. **Resumable Operations**:自Oracle 9i起引入,通过`DBMS_RESUMABLE`程序包支持暂停和恢复长时间运行的SQL或PL/SQL操作。 2. **Flashback Technologies**:自Oracle 10g开始,利用`DBMS_FLASHBACK`等程序包支持...

    Oracle-Built-In-Packages

    1.2.2 **服务器管理包** - 包括DBMS_JOB用于调度后台任务,DBMS_STATS用于收集和分析表的统计信息以优化查询性能,以及DBMS_LOCK用于实现应用程序级别的锁定机制。 1.2.3 **分布式数据库包** - 针对多数据库环境,...

    Oracle存储过程中任务和管道的应用

    对当前用户(测试用户),赋于以下权力:EXECUTE DBMS_PIPE、EXECUTE DBMS_LOCK、EXECUTE DBMS_JOB。 3. 建立模拟大业务处理存储过程 该存储过程通过循环 30 次,调用 DBMS_LOCK.SLEEP(1)(体眠 1 秒)和写管道...

    Oracle-API.zip

    Oracle API 还包含了一些重要的包,如 DBMS_LOCK、DBMS_OUTPUT 和 DBMS_SCHEDULER。DBMS_LOCK 包用于实现进程间的锁定机制,保证并发操作的安全;DBMS_OUTPUT 提供了在服务器端打印和查看信息的功能,对调试非常有用...

    ORACLE常用包参考手册

    下面我们将深入探讨一些常见的Oracle包及其相关知识点。 1. **DBMS_OUTPUT**:这个包用于在PL/SQL程序中生成调试信息。通过调用`DBMS_OUTPUT.PUT_LINE`函数,可以将文本信息输出到服务器的控制台或客户端的查询结果...

Global site tag (gtag.js) - Google Analytics