ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

PostgreSQL 表级锁扫盲ACCESS SHARE/ROW EXCLUSIVE/ACCESS EXCLUSIVE

PostgreSQL 表级锁扫盲ACCESS SHARE/ROW EXCLUSIVE/ACCESS EXCLUSIVE PostgreSQL 表级锁扫盲大白话版目标基础不牢也能看懂ACCESS SHARE/ROW EXCLUSIVE/ACCESS EXCLUSIVE这三种锁。一、先建立一个生活比喻把「一张表」想象成一间会议室不同的数据库操作就是不同的人想进这间会议室操作相当于加的锁SELECT只读进去看看资料不动东西ACCESS SHARE最弱INSERT/UPDATE/DELETE增删改数据进去改资料ROW EXCLUSIVE中等ALTER TABLE改表结构如改字段类型进去装修会议室拆墙、换桌子ACCESS EXCLUSIVE最强核心直觉看资料的人可以很多人一起看互不影响。改资料的人也可以很多人同时改改的是不同的行PG 用行锁保证安全。装修的人必须清场房间里一个人都不能有他自己独占。二、三种锁分别是什么1. ACCESS SHARE访问共享锁——「我只是看看」谁会加SELECT。意思我只是读数据不改任何东西。特点最弱的锁几乎和所有操作都能共存。唯一冲突对象只跟最强的ACCESS EXCLUSIVE装修冲突。也就是说只要没人在「改表结构」你的 SELECT 永远能跑。一句话看资料的人很随和除非有人要装修否则谁都不挡。2. ROW EXCLUSIVE行级排他锁——「我要改数据」谁会加INSERT/UPDATE/DELETE。意思我要往表里写数据增、删、改行。特点多个写操作可以同时进行只要改的不是同一行。和SELECT也不冲突一边有人读一边有人写没问题。冲突对象跟「改表结构 / 加约束」这类强锁冲突。注意名字有点误导叫 “ROW EXCLUSIVE”行排他但它是表级别的锁表示「我打算在这张表里改某些行」。真正锁住某一行的是另一套「行锁」机制。一句话改数据的人之间能和平共处也不挡读数据的人但会挡住装修的人。3. ACCESS EXCLUSIVE访问排他锁——「我要装修全部清场」谁会加ALTER TABLE改字段类型、DROP TABLE、TRUNCATE、VACUUM FULL、加某些约束等。意思我要动表的结构必须独占整张表。特点最强的锁和所有锁都冲突包括最弱的SELECT。它要开始干活时必须等表里所有人读的、写的都走光。它干活期间任何新的读、写都进不来全部排队等待。一句话装修的人最霸道必须清场期间谁都别想进来。三、一张「谁和谁能共存」的表✅ 可以同时进行❌ 冲突必须排队等待↓持有锁 \ 想进入→SELECT增删改改表结构SELECTACCESS SHARE✅✅❌增删改ROW EXCLUSIVE✅✅❌改表结构ACCESS EXCLUSIVE❌❌❌看这张表能得出两个关键结论日常读写SELECT 增删改互相都不挡所以数据库能高并发。只要有人「改表结构」就跟所有人冲突—— 这就是为什么改字段可能阻塞查询。四、把它和「改字段会阻塞查询」串起来当你执行ALTER TABLE a ...改字段时第 1 步ALTER 想拿「装修锁」(ACCESS EXCLUSIVE) → 必须等 a 表里正在跑的所有 SELECT / 增删改 都结束 如果有个慢查询跑 5 分钟ALTER 就干等 5 分钟 第 2 步ALTER 拿到锁后开始干活 → 这期间任何新的 SELECT 都被挡在门外 连只看看的读操作也进不来 第 3 步ALTER 干完释放锁 → 排队的查询才恢复正常而且 PG 的锁是排队制ALTER 在等锁时排在它后面的新 SELECT 也会被迫一起等这就是「一条 ALTER 堵住一大片查询」的原因。五、记忆口诀看的SELECT随和谁都不挡只怕装修。改数据的增删改能一起干活也不挡看的只怕装修。改结构的ALTER最霸道要清场挡住所有人。一句话总结全篇读和写可以愉快共存唯独「改表结构」要独占整张表 —— 所以改字段时一定要挑低峰期并配合lock_timeout避免长时间清场堵住业务。
返回列表