Skip to content

Commit 363d000

Browse files
authored
Merge pull request #14 from imqueue/fix-queries-with-transactions
fix: remove unnecessary transaction & refactor: replace notify releas…
2 parents f2679e3 + 20e8d27 commit 363d000

File tree

1 file changed

+33
-50
lines changed

1 file changed

+33
-50
lines changed

src/PgIpLock.ts

Lines changed: 33 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -402,32 +402,27 @@ export class PgIpLock implements AnyLock {
402402
RETURNS TRIGGER LANGUAGE PLPGSQL AS $$
403403
BEGIN PERFORM PG_NOTIFY(OLD.channel, '1'); RETURN OLD; END; $$
404404
`);
405+
405406
await this.options.pgClient.query(`
407+
DO $$
406408
BEGIN
409+
BEGIN
410+
DROP TRIGGER IF EXISTS notify_release_lock_trigger
411+
ON ${PgIpLock.schemaName}.lock;
412+
413+
CREATE CONSTRAINT TRIGGER notify_release_lock_trigger
414+
AFTER DELETE ON ${PgIpLock.schemaName}.lock
415+
DEFERRABLE INITIALLY DEFERRED
416+
FOR EACH ROW EXECUTE PROCEDURE ${
417+
PgIpLock.schemaName}.notify_lock();
418+
419+
COMMIT;
420+
EXCEPTION
421+
WHEN OTHERS THEN
422+
ROLLBACK;
423+
END;
424+
END $$
407425
`);
408-
409-
try {
410-
await this.options.pgClient.query(`
411-
DROP TRIGGER IF EXISTS notify_release_lock_trigger
412-
ON ${ PgIpLock.schemaName }.lock
413-
`);
414-
// noinspection SqlResolve
415-
await this.options.pgClient.query(`
416-
CREATE CONSTRAINT TRIGGER notify_release_lock_trigger
417-
AFTER DELETE ON ${PgIpLock.schemaName}.lock
418-
DEFERRABLE INITIALLY DEFERRED
419-
FOR EACH ROW EXECUTE PROCEDURE ${
420-
PgIpLock.schemaName}.notify_lock()
421-
`);
422-
await this.options.pgClient.query(`
423-
COMMIT
424-
`);
425-
} catch (err) {
426-
// istanbul ignore next
427-
await this.options.pgClient.query(`
428-
ROLLBACK
429-
`);
430-
}
431426
}
432427

433428
/**
@@ -437,35 +432,23 @@ export class PgIpLock implements AnyLock {
437432
*/
438433
private async createDeadlockCheck(): Promise<void> {
439434
await this.options.pgClient.query(`
435+
CREATE OR REPLACE FUNCTION ${PgIpLock.schemaName}.deadlock_check(
436+
old_app TEXT,
437+
new_app TEXT)
438+
RETURNS TEXT LANGUAGE PLPGSQL AS $$
439+
DECLARE num_apps INTEGER;
440440
BEGIN
441+
SELECT count(query) INTO num_apps
442+
FROM pg_stat_activity
443+
WHERE application_name = old_app;
444+
IF num_apps > 0 THEN
445+
RAISE EXCEPTION 'Duplicate channel for app %', new_app
446+
USING DETAIL = 'LOCKED';
447+
END IF;
448+
RETURN new_app;
449+
END;
450+
$$
441451
`);
442-
try {
443-
await this.options.pgClient.query(`
444-
CREATE OR REPLACE FUNCTION ${PgIpLock.schemaName}.deadlock_check(
445-
old_app TEXT,
446-
new_app TEXT)
447-
RETURNS TEXT LANGUAGE PLPGSQL AS $$
448-
DECLARE num_apps INTEGER;
449-
BEGIN
450-
SELECT count(query) INTO num_apps
451-
FROM pg_stat_activity
452-
WHERE application_name = old_app;
453-
IF num_apps > 0 THEN
454-
RAISE EXCEPTION 'Duplicate channel for app %', new_app
455-
USING DETAIL = 'LOCKED';
456-
END IF;
457-
RETURN new_app;
458-
END; $$;
459-
`);
460-
await this.options.pgClient.query(`
461-
COMMIT
462-
`);
463-
} catch (err) {
464-
// istanbul ignore next
465-
await this.options.pgClient.query(`
466-
ROLLBACK
467-
`);
468-
}
469452
}
470453
}
471454

0 commit comments

Comments
 (0)