Provides session-level (vs. transaction-level)
LockService
implementations. Session-level locks get automatically released if the database
connection drops, and overcome the shortcoming of the
StandardLockService
:
If Liquibase does not exit cleanly, the lock row may be left as locked. You can clear out the current lock by running
liquibase releaseLocks
which runsUPDATE DATABASECHANGELOGLOCK SET LOCKED=0
.
Running liquibase releaseLocks
in a micro-service production environment
may not be really feasible.
- MySQL
- MariaDB
- PostgreSQL
- Oracle
Support for other databases may be conveniently added by extending SessionLockService
.
The Oracle implementation relies on DBMS_LOCK
.
The user that executes liquibase must have EXECUTE
privilege on DBMS_LOCK
.
grant execute on SYS.DBMS_LOCK to <user>;
Oracle does not provide a way to retrieve lock details (e.g. who owns a lock) without elevated privileges. You can use the following query to get lock details:
select locks_allocated.*, locks.*
from dba_locks locks, sys.dbms_lock_allocated locks_allocated
where locks.lock_id1 = locks_allocated.lockid
and locks_allocated.name = 'lockname';
However, it's possible to get some information about the current session from SYS_CONTEXT
, so that's what gets returned by the DatabaseChangeLogLock
object.
To use the new lockservice, simply add a dependency to the library. Because the priority is higher than the StandardLockService, it will automatically be used (provided the database is supported). The library supports Liquibase v3.x and v4.x.
<dependency>
<groupId>com.github.blagerweij</groupId>
<artifactId>liquibase-sessionlock</artifactId>
<version>1.4.0</version>
</dependency>
implementation 'com.github.blagerweij:liquibase-sessionlock:1.4.0'
This module, both source code and documentation, is in the Public Domain, and comes with NO WARRANTY.
This module is using the Apache Software License, version 2.0. See http://www.apache.org/licenses/LICENSE-2.0.txt