锁
文章平均质量分 77
Hehuyi_In
这个作者很懒,什么都没留下…
展开
-
会长期锁表吗?PostgreSQL add column default 在各版本的优化
pg如何处理新增列的默认值,与Oracle有何区别原创 2023-12-01 19:42:20 · 2581 阅读 · 1 评论 -
会长期锁表吗?Oracle add column default 在各版本的优化
Oracle add column default 在各版本的优化原创 2023-11-29 14:55:43 · 4535 阅读 · 0 评论 -
postgresql源码学习(48)—— 流复制冲突(备库锁阻塞与Vacuum冲突)
当hot_standby参数设置为on时,备库可以支持读操作。但有时你会发现,查询执行着突然遇到 terminating connection due to conflict with recovery 报错,这就是所谓的流复制冲突。原创 2022-10-23 22:08:18 · 2303 阅读 · 0 评论 -
postgresql源码学习(十五)—— 行锁③-死锁检测
假设等待图中有环,且环全部由实边构成,那么此时只能中断某个事务来打破这个环,这就是死锁。若环还有虚边,说明有事务尚未真正持有锁,此时还可以通过调整事务顺序来避免死锁。假设事务A持有表的共享锁,事务B申请表的排他锁被阻塞,事务C又想申请该表共享锁。此时事务C需要等待事务B,于是BC都在等待队列中,pg称这种等待的边为“虚边”。在查找环的过程中,它会优先从waitOrders数组中选择等待队列,如果没有,才会使用锁本身的等待队列。假设事务A持有表的共享锁或排它锁,当事务B申请表的排他锁时,就要进入等待。原创 2022-09-18 00:40:28 · 1364 阅读 · 0 评论 -
postgresql源码学习(十四)—— 行锁②-update操作与行锁
本篇以最简单的update操作为例,来看更新过程中的行锁添加、冲突检测、元组状态判断、可见性判断等。heapam_visibility.c 文件中)根据不同的元组状态,决定继续执行何种操作。例如元组是否能被更新取决于是否可见,不可见的元组显然是无需更新的。元组对当前快照根本不可见,自然无法处理。技术内幕:事务处理深度探索》第2章。元组被已提交事务更新过。元组被已提交事务删除过。函数内容如下(有删减)原创 2022-09-17 17:32:57 · 2096 阅读 · 0 评论 -
postgresql源码学习(十二)—— 常规锁⑤-事务等待
一、 等待机制 如果通过冲突检测发现可以获得锁,则通过GrantLock和GrantLocalLock函数增加锁的引用计数。如果发现不能获得锁,则进入等待状态。 等待状态的判断通过WaitOnLock函数实现,调用关系是WaitOnLock函数 -> ProcSleep函数。ProcSleep函数一方面将当前事务加入等待队列,另一方面还要做死锁检测。二、 ProcSleep函数1. 函数主要流程图补画了一个流程图,可以对照着看,之前看着看着下面代码的判断...原创 2022-05-21 22:47:22 · 2025 阅读 · 0 评论 -
postgresql源码学习(十一)—— 常规锁④-冲突检测
在主锁表和进程锁表中保存锁之后,就可以进行锁的冲突检测。如果检测到当前申请的锁模式与其他事务已持有锁冲突,则必须进入等待状态。一、 函数调用 冲突检测函数是LockCheckConflicts,其上层调用在我们之前提到过的LockAcquireExtended函数(当时我们只看了本地锁表相关代码,没有看全部)。 //lockMethodTable->conflictTab[lockmode]获取与待申请锁模式冲突的锁模式,lock->waitMask......原创 2022-05-20 17:49:16 · 1749 阅读 · 0 评论 -
postgresql源码学习(十三)—— 行锁①-行锁模式与xmax
一、 四种行锁1. 简介与兼容性分析 pg采用元组级常规锁+xmax结合的方式实现行锁。不单纯用元组级常规锁,是为了避免事务修改行过多时,锁表急剧增大导致性能劣化,并且锁表在共享内存中的大小是有限的。pg中通常有两种方式会用到行锁:对行执行update,delete操作 显式指定行锁(例如select for update)在新版本中,显式加行锁共有4种写法 行锁类型 简介 FOR UPDATE ...原创 2022-05-19 23:51:24 · 4049 阅读 · 0 评论 -
postgresql源码学习(十)—— 常规锁③-主锁表与进程锁表的初始化与查询
一、 主锁表与进程锁表的结构 在数据库启动阶段,pg通过InitLocks函数初始化保存锁对象的共享内存空间。在共享内存中,有两个“锁表”用于保存锁对象,分别是:主锁表(LockMethodLockHash) 进程锁表(LockMethodProcLockHash) 主锁表用于保存当前数据库中所有事务的锁对象,即LOCK结构体。typedef struct LOCK{ /* hash key */ LOCKTAG tag; /* 锁对象的唯一ID *...原创 2022-05-19 14:16:19 · 2104 阅读 · 0 评论 -
postgresql源码学习(九)—— 常规锁②-强弱锁与Fast Path
一、 强锁与弱锁 根据兼容性表,彼此相容的3个锁(1-3级,AccessShareLock、RowShareLock、RowExclusiveLock)是弱锁,4级锁ShareUpdateExclusiveLock比较特殊,既不是强锁也不是弱锁,5-8级的4个则是强锁。 弱锁只保存在当前会话,从而避免频繁访问共享内存的主锁表,提高数据库的性能。虽然判断是否有强锁也需要访问共享内存中的FastPathStrongRelationLocks,但这种访问粒度比较小。...原创 2022-05-15 00:34:32 · 2496 阅读 · 0 评论 -
postgresql源码学习(八)—— 常规锁①-加锁步骤与本地锁表
一、 简介 有关常规锁的类型、等级、兼容性、查看方法等,属于DBA的日常运维知识,可以参考 PG锁和阻塞发现与处理_Hehuyi_In的博客-CSDN博客_pg查看阻塞 这里不重复列了。二、 常规锁的加锁对象 如果要对一个表进行操作,通常会通过heap_open打开这个表,并在打开时指定需要的锁模式。之后会有一系列函数将锁模式传递下去,最终通过LockRelationOid函数将表的Oid和lockmode联系在一起。# define heap_open(r,l...原创 2022-05-14 21:21:57 · 3036 阅读 · 0 评论 -
postgresql源码学习(七)—— 自旋锁与轻量锁
一、 pg中的锁pg中的锁可以分为3个层次:自旋锁(Spin Lock):是一种和硬件结合的互斥锁,借用了硬件提供的原子操作的原语来对一些共享变量进行封锁,通常适用于临界区比较小的情况。轻量锁(Lightweight Lock):负责保护共享内存中的数据结构,有共享和排他两种模式,类似Oracle中的latch常规锁(Regular Lock):就是通常说的对数据库对象的锁。按照锁粒度,可以分为表锁、页锁、行锁等;按照等级,pg锁一共有8个等级。另外常规锁有死锁检测,而前两种没有。二原创 2022-05-07 23:31:30 · 2859 阅读 · 0 评论 -
关于SQL Server alter table修改字段类型
最近业务方觉得业务表int字段精度不够,需要转为decimal。操作的数据库版本是2014,涉及30多张表,其中有9个千万级的大表,还不止改一个字段。这里总结下注意事项和遇到的问题:隐式转换问题:代码对应变量类型要改,关联表字段类型要改,否则就是在制造性能炸弹 索引问题:字段上有索引需要先删除,改完类型一定要记得建回去 性能问题:删除索引前对应业务sql必须停掉,否则高并发全表扫描瞬间能将资源耗尽 阻塞对应表读写:alter过程锁表,对该表的读写操作均会被阻塞 -- 2016支持online.原创 2021-07-24 10:42:33 · 4265 阅读 · 0 评论 -
sqlserver 如何找到 WaitResource 对应的对象名
在sqlserver 扩展事件的block和死锁报告中,经常能看到类似这样的等待资源waitresource=PAGE: 6:3:70133 waitresource=KEY: 6:72057594041991168 (ce52f92a058c)应该如何通过它们找到 WaitResource 对应的对象名呢一、waitresource=PAGEwaitresource=PAGE: 6:3:70133 分别对应的是Database_Id : FileId : PageNumber...原创 2020-08-11 16:23:44 · 3143 阅读 · 1 评论 -
MySQL InnoDB锁类型小结
(一)先说明一下定义:1. 读现象(Read phenomena):SQL 92标准规定了3种不同的读现象。脏读、不可重复读和幻读。分别解释一下。1.1 脏读:A dirty read (aka uncommitted dependency) occurs when a transaction is allowed to read data from a row that has be...原创 2020-04-07 01:10:40 · 1555 阅读 · 0 评论 -
sqlserver drop index导致主从延迟问题
一、 问题背景收到业务A主从延迟的告警,该业务是sqlserver一主两从架构,但告警时只有一个从库有延迟,另一个正常,另外也没有收到其他告警。二、 问题分析及处理登录检查,发现从库1有延迟而从库2正常--主库查:select replica_id,last_commit_time as 'primary_last_commit_tm' from sys.dm_hadr_...原创 2019-12-09 22:04:40 · 1747 阅读 · 0 评论 -
SQL Server死锁跟踪常用方法
一、利用windows计数器下面的查询提供了自从上次重启以来在本服务器上发生的所有死锁:SELECT cntr_value AS NumOfDeadLocks FROM sys.dm_os_performance_countersWHERE object_name = 'SQLServer:Locks' AND counter_name = 'Number of Deadl...原创 2019-09-20 22:28:01 · 8396 阅读 · 1 评论 -
Oracle 单实例与RAC锁
1. bitmap索引--session 1SQL> create table t1_tx(id number,name varchar2(20)) ;Table created.SQL> insert into t1_tx select rownum,chr(97+mod(rownum,2)) from dual connect by level<=1...原创 2020-04-23 00:01:43 · 1928 阅读 · 1 评论 -
V$SESSION SQL_ID 为空,找不到SQL_ID
遇到过这个问题,网上搜到这篇文章,实际遇到的时候可以测试下效果首先我们来做个实验:SQL> select sid from v$mystat where rownum=1;SID----------1150SQL> update test set owner='BIGSB' where object_id<100;...转载 2019-07-24 14:40:01 · 2987 阅读 · 1 评论 -
PG锁和阻塞发现与处理
一、 阻塞查询PostgreSQL提供了两个视图pg_locks展示锁信息,每一个被锁或者等待锁的对象一条记录。 pg_stat_activity,每个会话一条记录,显示会话状态信息。查看被阻塞进程-- granted=t是阻塞别人的,f是被阻塞的SELECT database, locktype, relation, relation::regclass, mode, pid FROM pg_locks where granted='f';根据pid和relation找原创 2020-09-25 17:43:36 · 7155 阅读 · 0 评论