@@ -12,43 +12,39 @@ The alternative using a table where a “Lock-Row” is stored has the disadvant
1212## Example (bad)
1313
1414```
15- -- create locking table
16- CREATE TABLE application_locks (
17- lock_name VARCHAR2(128 CHAR) NOT NULL PRIMARY KEY
18- ,lock_time TIMESTAMP NOT NULL
19- ) ORGANIZATION INDEX;
20- -- definition
15+ -- Bad
16+ /* Example */
2117CREATE OR REPLACE PACKAGE BODY lock_up IS
18+ -- manage locks in a dedicated table created as follows:
19+ -- CREATE TABLE app_locks (
20+ -- lock_name VARCHAR2(128 CHAR) NOT NULL primary key
21+ -- );
22+
2223 PROCEDURE request_lock (in_lock_name IN VARCHAR2) IS
23- PRAGMA AUTONOMOUS_TRANSACTION;
2424 BEGIN
25- INSERT INTO application_locks (lock_name, lock_time) VALUES (in_lock_name, systimestamp);
26- COMMIT;
27- EXCEPTION
28- WHEN DUP_VAL_ON_INDEX THEN
29- RAISE err.e_lock_request_failed;
25+ -- raises dup_val_on_index
26+ INSERT INTO app_locks (lock_name) VALUES (in_lock_name);
3027 END request_lock;
31-
32- PROCEDURE release_lock (in_lock_name IN VARCHAR2) IS
33- PRAGMA AUTONOMOUS_TRANSACTION;
28+
29+ PROCEDURE release_lock(in_lock_name IN VARCHAR2) IS
3430 BEGIN
35- DELETE FROM application_locks
36- WHERE lock_name = in_lock_name;
37- COMMIT;
31+ DELETE FROM app_locks WHERE lock_name = in_lock_name;
3832 END release_lock;
3933END lock_up;
4034/
41- -- call
35+
36+ /* Call bad example */
4237DECLARE
38+ l_handle VARCHAR2(128 CHAR);
4339 co_lock_name CONSTANT VARCHAR2(30 CHAR) := 'APPLICATION_LOCK';
4440BEGIN
45- lock_up.request_lock(in_lock_name => co_lock_name);
41+ l_handle := lock_up.request_lock(in_lock_name => co_lock_name);
4642 -- processing
47- lock_up.release_lock(in_lock_name => co_lock_name );
43+ lock_up.release_lock(in_lock_handle => l_handle );
4844EXCEPTION
4945 WHEN OTHERS THEN
5046 -- log error
51- lock_up.release_lock(in_lock_name => co_lock_name );
47+ lock_up.release_lock(in_lock_handle => l_handle );
5248 RAISE;
5349END;
5450/
5753## Example (good)
5854
5955```
60- -- definition
56+ /* Example */
6157CREATE OR REPLACE PACKAGE BODY lock_up IS
62- FUNCTION request_lock (in_lock_name IN VARCHAR2
63- ,in_release_on_commit IN BOOLEAN := FALSE) RETURN VARCHAR2 IS
58+ FUNCTION request_lock(
59+ in_lock_name IN VARCHAR2,
60+ in_release_on_commit IN BOOLEAN := FALSE)
61+ RETURN VARCHAR2 IS
6462 l_lock_handle VARCHAR2(128 CHAR);
6563 BEGIN
66- SYS.DBMS_LOCK.ALLOCATE_UNIQUE (lockname => in_lock_name
67- ,lockhandle => l_lock_handle
68- ,expiration_secs => constants_up.co_one_week);
69-
70- IF sys.DBMS_LOCK.REQUEST(lockhandle => l_lock_handle
71- ,lockmode => sys.DBMS_LOCK.X_MODE
72- ,TIMEOUT => sys.DBMS_LOCK.MAXWAIT
73- ,release_on_commit => COALESCE(in_release_on_commit
74- ,FALSE)) > 0 THEN
64+ sys.dbms_lock.allocate_unique(
65+ lockname => in_lock_name,
66+ lockhandle => l_lock_handle,
67+ expiration_secs => constants_up.co_one_week
68+ );
69+ IF sys.dbms_lock.request(
70+ lockhandle => l_lock_handle,
71+ lockmode => sys.dbms_lock.x_mode,
72+ timeout => sys.dbms_lock.maxwait,
73+ release_on_commit => COALESCE(in_release_on_commit, FALSE)
74+ ) > 0
75+ THEN
7576 RAISE err.e_lock_request_failed;
7677 END IF;
77-
7878 RETURN l_lock_handle;
7979 END request_lock;
80-
81- PROCEDURE release_lock (in_lock_handle IN VARCHAR2) IS
80+
81+ PROCEDURE release_lock(in_lock_handle IN VARCHAR2) IS
8282 BEGIN
83- IF sys.DBMS_LOCK.RELEASE (lockhandle => in_lock_handle) > 0 THEN
83+ IF sys.dbms_lock.release (lockhandle => in_lock_handle) > 0 THEN
8484 RAISE err.e_lock_request_failed;
85- END IF;
85+ END IF;
8686 END release_lock;
8787END lock_up;
8888/
89- -- call
89+
90+ /* Call good example */
9091DECLARE
9192 l_handle VARCHAR2(128 CHAR);
9293 co_lock_name CONSTANT VARCHAR2(30 CHAR) := 'APPLICATION_LOCK';
0 commit comments