@@ -12,6 +12,52 @@ 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
21+ CREATE OR REPLACE PACKAGE BODY lock_up IS
22+ PROCEDURE request_lock (in_lock_name IN VARCHAR2) IS
23+ PRAGMA AUTONOMOUS_TRANSACTION;
24+ 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;
30+ END request_lock;
31+
32+ PROCEDURE release_lock (in_lock_name IN VARCHAR2) IS
33+ PRAGMA AUTONOMOUS_TRANSACTION;
34+ BEGIN
35+ DELETE FROM application_locks
36+ WHERE lock_name = in_lock_name;
37+ COMMIT;
38+ END release_lock;
39+ END lock_up;
40+ /
41+ -- call
42+ DECLARE
43+ co_lock_name CONSTANT VARCHAR2(30 CHAR) := 'APPLICATION_LOCK';
44+ BEGIN
45+ lock_up.request_lock(in_lock_name => co_lock_name);
46+ -- processing
47+ lock_up.release_lock(in_lock_name => co_lock_name);
48+ EXCEPTION
49+ WHEN OTHERS THEN
50+ -- log error
51+ lock_up.release_lock(in_lock_name => co_lock_name);
52+ RAISE;
53+ END;
54+ /
55+ ```
56+
57+ ## Example (good)
58+
59+ ```
60+ -- definition
1561CREATE OR REPLACE PACKAGE BODY lock_up IS
1662 FUNCTION request_lock (in_lock_name IN VARCHAR2
1763 ,in_release_on_commit IN BOOLEAN := FALSE) RETURN VARCHAR2 IS
@@ -40,11 +86,7 @@ CREATE OR REPLACE PACKAGE BODY lock_up IS
4086 END release_lock;
4187END lock_up;
4288/
43- ```
44-
45- ## Example (good)
46-
47- ```
89+ -- call
4890DECLARE
4991 l_handle VARCHAR2(128 CHAR);
5092 co_lock_name CONSTANT VARCHAR2(30 CHAR) := 'APPLICATION_LOCK';
@@ -59,4 +101,4 @@ EXCEPTION
59101 RAISE;
60102END;
61103/
62- ```
104+ ```
0 commit comments