General Information |
Source |
{ORACLE_HOME}/rdbms/admin/userlock.sql |
conn / as sysdba
@?/rdbms/admin/userlock.sql
conn uwclass/uwclass
desc user_lock |
Constants |
Lock Mode |
Data Type |
Value |
global |
NUMBER |
1 |
local |
NUMBER |
0 |
maxwait |
NUMBER |
32767 |
nl_mode |
NUMBER |
1 |
ss_mode |
NUMBER |
2 |
sx_mode |
NUMBER |
3 |
s_mode |
NUMBER |
4 |
ssx_mode |
NUMBER |
5 |
x_mode |
NUMBER |
6 |
|
Dependencies |
psdlcv |
psdlgt |
psdlrl |
psdwat |
|
Lock Compatibility Rules
When another process holds "held", an attempt to get "get" does the following |
Held |
NL |
SS |
SX |
S |
SSX |
X |
NL |
Success |
Success |
Success |
Success |
Success |
Success |
SS |
Success |
Success |
Success |
Success |
Success |
Fail |
SX |
Success |
Success |
Success |
Fail |
Fail |
Fail |
S |
Success |
Success |
Fail |
Fail |
Fail |
Fail |
SSX |
Success |
Success |
Fail |
Fail |
Fail |
Fail |
X |
Success |
Fail |
Fail |
Fail |
Fail |
Fail |
|
|
CONVERT |
Determine if a lock can be converted |
convert(id NUMBER, lockmode NUMBER, timeout NUMBER) RETURN NUMBER;
0 = Success | 1 = Timeout | 2 = Deadlock | 3 = Parameter Error
4 = Don't own lock ID |
SELECT user_lock.convert(2000, 1, 0)
FROM dual; |
|
RELEASE |
Release an existing lock |
release(id NUMBER) RETURN NUMBER;
0 = Success | 4 = Don't own lock ID |
CREATE OR REPLACE PROCEDURE
myproc(iKey in VARCHAR2) IS
vHashVal NUMBER;
vLockStat NUMBER;
vIdx NUMBER;
BEGIN
-- Compute Hash value for iKey
vHashVal := 0;
FOR vIdx IN 1 .. LENGTH(iKey)
LOOP
vHashVal := mod(vHashVal * 64 + ASCII(SUBSTR(iKey,vIdx,1)),
2000000000);
END LOOP;
-- Create a user lock for hash(iKey)
vLockStat := user_lock.request(vHashVal, user_lock.x_mode,
user_lock.maxwait, user_lock.global);
-----------------------------------
-- CRITICAL SECTION:
-- SOME CODE THAT MUST NOT RUN
-- CONCURRENTLY FOR THE SAME iKey
-----------------------------------
-- Release the user lock for hash(iKey)
vLockStat := user_lock.release(vHashVal);
EXCEPTION
WHEN OTHERS THEN
BEGIN
-- Release the user lock for hash(iKey)
vLockStat := user_lock.release(vHashVal);
END;
END myproc;
/ |
|
REQUEST |
Request a lock |
user_lock.request(id NUMBER, lockmode NUMBER, timeout NUMBER, global number) RETURN NUMBER ;
0 = Success | 1 = Timeout | 2 = Deadlock | 3 = Parameter Error |
SELECT user_lock.request(20296, 1, 0, 100)
FROM dual; |
|
SLEEP |
Sleep |
user_lock.sleep(tens_of_millisecs NUMBER); |
exec user_lock.sleep(500) |