SELECT * FROM DATABASECHANGELOGLOCK;
+----+--------+---------------------+-----------------------------------+
| ID | LOCKED | LOCKGRANTED | LOCKEDBY |
+----+--------+---------------------+-----------------------------------+
| 1 | | 2020-09-08 16:00:21 | 192.168.16.18 (192.168.16.18) |
+----+--------+---------------------+-----------------------------------+
1 row in set (0.00 sec)
# 更新状态
UPDATE DATABASECHANGELOGLOCK \
SET locked=0, lockgranted=null, lockedby=null \
WHERE id=1;
现象:启动程序时报错"Liquibase: Waiting for changelog lock..."解决:SELECT * FROM DATABASECHANGELOGLOCK;+----+--------+---------------------+-----------------------------------+| ID | LOCKED | LOCKGRANTED | LOCKEDBY |+----.
用户A读一条纪录,然后修改该条纪录
这是用户B修改该条纪录
这里用户A的事务里锁的性质由共享锁企图上升到独占锁(for update),而用户B里的独占锁由于A有共享锁存在所以必须等A释
放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。
这种死锁比较隐蔽,但其实在稍大点的项目中经常发生。
解决方法:
让用户A的事务(即先读后写类型的操作),在select 时就是用Update lock
语法如下:
select * from table1 with(updlock) where ....
解决idea调试过程中liquibase –liquibase.lockservice: Waiting for changelog lock导致数据库死锁问题
今天项目启动控制台突然卡住,liquibase一直在打印 waiting for changelog lock
这可能是由于一个被杀死的liquibase进程未在DATABASECHANGELOGLOCK表上释放其锁定。
通过以下方法解决:
#查询谁锁住了数据库
SELECT * FROM DATABASECHANGELOGLOCK;
# 更新状态
UPDATE DATABASECHANGELOGLOCK
SET locked=0, lockgranted=null, lockedby=null
Waiting for changelog lock....
Running the migration script for a database may produce this:
INFO … Liquibase: Waiting for changelog lock....
INFO … Liquib...
数据库锁就是一种保证数据一致性而使各种共享资源在被并发访问,并发访问人有序所设计的一种规则。
每一种存储引擎的锁机制都是为各自面对的场景所设计,所以各个存储引擎机制也有较大区别。
mysql各个存储引擎使用三类锁机制,行级锁定,页级锁定,表级锁定。
行级锁最大的特点就是锁定对象的颗粒度很小,也是没有各大数据库管理软件实现的最小粒度的,由于粒度小,所以发生的资源竞争概率就很低,能够...
解决死锁的常见方法包括:
1. 观察死锁日志:使用 SQL Server 的系统存储过程 sp_lock 和系统视图 sys.dm_tran_locks 可以获取死锁相关信息,以便更好地了解死锁情况。
2. 优化查询:通过优化 SQL 语句来减少争夺数据库资源的情况。
3. 修改事务隔离级别:将事务隔离级别更改为更低的级别,可以减少死锁的发生。
4. 强制回滚或终止事务:使用 SQL Server 的系统存储过程 sp_resetstatus 或管理工具来强制回滚或终止死锁事务。
5. 调整锁超时时间:使用 SET LOCK_TIMEOUT 语句来调整锁定超时时间,以避免死锁的发生。
死锁是数据库管理员必须面对的常见问题,及时解决死锁有助于保证数据库的稳定运行。