Skip to content

Commit 6af4b6d

Browse files
use example as provided by PL/SQL Cop
1 parent 781b102 commit 6af4b6d

File tree

1 file changed

+41
-40
lines changed
  • docs/4-language-usage/8-patterns/4-ensure-single-execution-at-a-time-of-a-program-unit

1 file changed

+41
-40
lines changed

docs/4-language-usage/8-patterns/4-ensure-single-execution-at-a-time-of-a-program-unit/g-8410.md

Lines changed: 41 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -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 */
2117
CREATE 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;
3933
END lock_up;
4034
/
41-
-- call
35+
36+
/* Call bad example */
4237
DECLARE
38+
l_handle VARCHAR2(128 CHAR);
4339
co_lock_name CONSTANT VARCHAR2(30 CHAR) := 'APPLICATION_LOCK';
4440
BEGIN
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);
4844
EXCEPTION
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;
5349
END;
5450
/
@@ -57,36 +53,41 @@ END;
5753
## Example (good)
5854

5955
```
60-
-- definition
56+
/* Example */
6157
CREATE 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;
8787
END lock_up;
8888
/
89-
-- call
89+
90+
/* Call good example */
9091
DECLARE
9192
l_handle VARCHAR2(128 CHAR);
9293
co_lock_name CONSTANT VARCHAR2(30 CHAR) := 'APPLICATION_LOCK';

0 commit comments

Comments
 (0)