PG/mysql/oracle--- 长事务对后续事务影响分析

PG长事务分析

示例

假设在时间点A有一个长事务正在运行,并且在时间点A+1执行了VACUUM FULL操作。以下是可能发生的情况:

  1. 时间点A :长事务开始并持有ACCESS SHARE锁。
  2. 时间点A+1 :尝试执行VACUUM FULL操作。
    • VACUUM FULL需要ACCESS EXCLUSIVE锁,但长事务持有的ACCESS SHARE锁阻止了VACUUM FULL获取锁。
    • VACUUM FULL进入等待状态,直到长事务结束并释放其锁。
  3. 时间点A+1以后 :
    • 读操作 :后续的SELECT操作可以继续执行,因为它们只需要ACCESS SHARE锁。
    • 写操作 :后续的INSERT、UPDATE或DELETE操作会被阻塞,因为它们需要ROW EXCLUSIVE锁或更高级别的锁,而这些锁与VACUUM FULL所需的ACCESS EXCLUSIVE锁不兼容。
    • 其他高优先级操作 :后续的ALTER TABLE、DROP TABLE等操作也会被阻塞。

总结

  • 在时间点A+1以后的事务是否会受到阻塞取决于它们需要获取的锁类型。
  • 读操作通常不会被阻塞,因为它们只需要较低级别的锁。
  • 写操作和其他需要较高级别锁的操作会被阻塞,直到VACUUM FULL能够获取到ACCESS EXCLUSIVE锁并完成其操作。

Mysql长事务-+后面mysql导致系统崩溃

在MySQL中,FLUSH TABLES ... WITH READ LOCK 命令会锁定所有表,并阻止其他事务对这些表进行写操作。这意味着在执行 FLUSH TABLES ... WITH READ LOCK 之后的所有写操作都会被阻塞,直到锁被释放。

具体来说:

  1. A时间点执行长事务select语句:假设在时间点A开始了一个长时间运行的SELECT查询,这个查询会持有读锁(取决于隔离级别和查询类型)。

  2. A+1时间点执行flush table for lock :在时间点A+1,执行了 FLUSH TABLES ... WITH READ LOCK 命令。这个命令会获取全局读锁,阻止所有其他写操作和某些读操作。

在这种情况下,以下几点需要注意:

  • 所有写操作会被阻塞 :从时间点A+1开始,所有试图对表进行写操作的事务都会被阻塞,直到 FLUSH TABLES ... WITH READ LOCK 命令完成并且锁被释放。
  • 某些读操作也会被阻塞 :如果在执行 FLUSH TABLES ... WITH READ LOCK 时,有新的读操作尝试访问被锁定的表,这些读操作也会被阻塞,直到锁被释放。
  • 已存在的读操作不受影响:已经存在的读操作(例如时间点A开始的长事务SELECT查询)不会被阻塞,但新的读操作会被阻塞。

总结来说,从时间点A+1开始,所有新的写操作和某些新的读操作都会被阻塞,直到 FLUSH TABLES ... WITH READ LOCK 命令完成并且锁被释放。已存在的读操作则不会受到影响。

相关推荐
笃行3503 小时前
数据库性能优化的五处内核改造,KingbaseES 配了四件诊断工具
数据库
非优秀程序员5 小时前
第02章 杭电的英语老师与一台服务器|《互联网产品恩仇录》
数据库·node.js·代码规范
SelectDB10 小时前
SelectDB 是哪个公司的?是国产数据库吗?一篇讲清飞轮科技与 Apache Doris 的关系
数据库
这个DBA有点耶10 小时前
库内计算推理:一条SQL背后的算子融合,和外挂方案差了几次网络往返
数据库·人工智能·sql
这个DBA有点耶12 小时前
函数索引的“完全一致”有多苛刻:写法、字符集、类型,差一处就失效
数据库·mysql·代码规范
星恒随风12 小时前
MySQL 从零入门(三):表的约束详解
linux·服务器·数据库·笔记·mysql
Alluxio13 小时前
Alluxio + OCI:为 AI 工作负载实现亚毫秒访问延迟与可扩展吞吐
运维·数据库·人工智能·分布式·缓存·ai·语言模型
数据库急诊室_阿哲17 小时前
一次加索引建议的复核记录:从报告到签字
数据库·ai数据库
青瓦梦滋17 小时前
Redis主从复制
服务器·数据库·redis·缓存·bootstrap
慧都小妮子18 小时前
Wyn商业智能国产数据库适配:数据接入、分析缓存与审计日志验证清单
数据库·数据分析·数据可视化·审计日志·商业智能