Lock provided by plain JDBC. It uses a table that contains lock_name and locked_until.
-
Attempts to insert a new lock record. Since lock name is a primary key, it fails if the record already exists. As an optimization,
we keep in-memory track of created lock records.
-
If the insert succeeds (1 inserted row) we have the lock.
-
If the insert failed due to duplicate key or we have skipped the insertion, we will try to update lock record using
UPDATE tableName SET lock_until = :lockUntil WHERE name = :lockName AND lock_until <= :now
-
If the update succeeded (1 updated row), we have the lock. If the update failed (0 updated rows) somebody else holds the lock
-
When unlocking, lock_until is set to now.