能够造成事务长时间阻塞的原因包含?()
A. 长事务持续持有行锁
B. DDL 执行占用 MDL 元数据锁
C. 业务高频短查询
D. 锁资源出现循环等待死锁
1 个赞
ABD 解析:长事务锁、DDL 元数据锁、死锁都会阻塞事务;高频短查询正常执行,一般不会阻塞。
-
选项 A (长事务持续持有行锁) 正确 :
当一个事务运行时间很长或操作数据量大时,会长时间持有大量行锁。其他需要修改这些被锁定数据的并发事务就必须排队等待,从而导致严重的阻塞甚至系统雪崩3。 -
选项 B (DDL 执行占用 MDL 元数据锁) 正确 :
DDL(数据定义语言)操作在执行时需要获取表的 MDL 写锁。如果此时表上存在尚未提交的长事务(持有 MDL 读锁),DDL 就会因为申请不到写锁而被阻塞。由于 MySQL 的 MDL 锁是公平锁,排在后面的新读写事务也会因为无法越过 DDL 的申请而全部被阻塞,瞬间导致整张表的读写瘫痪1。 -
选项 C (业务高频短查询) 错误 :
高频短查询通常意味着事务执行快、锁释放迅速,这种模式反而有利于提高数据库的并发度,一般不会造成长时间的资源阻塞。 -
选项 D (锁资源出现循环等待死锁) 错误 :
死锁是指多个事务互相持有对方需要的锁并陷入“循环等待”的状态3。虽然死锁会导致事务受阻,但现代数据库引擎(如 InnoDB)默认开启了主动死锁检测机制。一旦检测到死锁,系统会立即回滚代价最小的那个事务来打破僵局,因此死锁通常会被快速解决,不会造成“长时间”的阻塞