PostgreSQL查找行锁等待

PostgreSQL锁等待与阻塞分析
本文通过三个会话演示了在PostgreSQL中如何形成锁等待和事务阻塞的情况,详细展示了如何使用SQL查询来查找阻塞者,以及如何获取更详细的阻塞信息。
第一个session:
postgres=# begin;
BEGIN
postgres=# update t10 set id=1 where id=111;
UPDATE 1
postgres=# select pg_backend_pid();
 pg_backend_pid 
----------------
          28120
(1 row)

postgres=# update t100 set id=222 where id=2;
UPDATE 1
postgres=# 



第二个session:
[pg121@iZm5ehqfjhnsbtxrzrnh2zZ ~]$ psql -d postgres
Password for user pg121: 
psql (12.1)
Type "help" for help.

postgres=# select pg_backend_pid();
 pg_backend_pid 
----------------
          28210
(1 row)

postgres=# update t10 set id=1 where id=111;

---->>>>此时hang住,也就是说,此时锁等待形成(pid=28210的事务正在等待pid=28120的事务),请注意,是锁等待形成,不是锁形成。

第三个session:
[pg121@iZm5ehqfjhnsbtxrzrnh2zZ ~]$ psql -d postgres
Password for user pg121: 
psql (12.1)
Type "help" for help.

postgres=# select pg_backend_pid();
 pg_backend_pid 
----------------
          29654
(1 row)

postgres=# update t100 set id=222 where id=2;
---->>>>此时hang住,也就是说,此时锁等待形成(pid=29654的事务正在等待pid=28120的事务),请注意,是锁等待形成,不是锁形成。

查找阻塞者:
postgres=# SELECT
postgres-#     l2.pid as blocker_session_pid,
postgres-#     l2.mode as blocker_session_mode,
postgres-#     l2.granted blocker_session_granter,
postgres-# l1.pid as blocked_session_pid,
postgres-#     l1.mode as blocked_session_mode,
postgres-#     l1.granted blocked_session_granter
postgres-# FROM
postgres-#     pg_locks l1
postgres-# JOIN
postgres-#     pg_locks l2 on (
postgres(#         (
postgres(#             l1.locktype,
postgres(#             l1.database,
postgres(#             l1.relation,
postgres(#             l1.page,
postgres(#             l1.tuple,
postgres(#             l1.virtualxid,
postgres(#             l1.transactionid,
postgres(#             l1.classid,
postgres(#             l1.objid,
postgres(#             l1.objsubid
postgres(#         )
postgres(#     IS NOT DISTINCT FROM
postgres(#         (
postgres(#             l2.locktype,
postgres(#             l2.database,
postgres(#             l2.relation,
postgres(#             l2.page,
postgres(#             l2.tuple,
postgres(#             l2.virtualxid,
postgres(#             l2.transactionid,
postgres(#             l2.classid,
postgres(#             l2.objid,
postgres(#             l2.objsubid
postgres(#         )
postgres(#     )
postgres-# WHERE
postgres-#     NOT l1.granted
postgres-# AND
postgres-#     l2.granted;
 blocker_session_pid | blocker_session_mode | blocker_session_granter | blocked_session_pid | blocked_session_mode | blocked_session_granter 
---------------------+----------------------+-------------------------+---------------------+----------------------+-------------------------
               28120 | ExclusiveLock        | t                       |               29654 | ShareLock            | f
               28120 | ExclusiveLock        | t                       |               28210 | ShareLock            | f
(2 rows)

postgres=# 
请注意:如上查询行锁的脚本参考自https://wiki.postgresql.org/wiki/Find_Locks
或者使用如下脚本,以获得更多的信息:
postgres=# SELECT
postgres-# lock2.pid as blocker_pid,
postgres-# stat2.usename as blocker_user,
postgres-# stat2.query as blocker_statement,
postgres-# stat2.state as blocker_state,
postgres-# lock1.pid as blocked_pid,
postgres-# stat1.usename as blocked_user,
postgres-# stat1.query as blocked_statement,
postgres-# stat1.state as blocked_state,
postgres-# clock_timestamp() - stat1.query_start as blocked_duration
postgres-# FROM pg_catalog.pg_locks lock1
postgres-# JOIN pg_catalog.pg_stat_activity stat1 on lock1.pid = stat1.pid
postgres-# JOIN pg_catalog.pg_locks lock2 on
postgres-# (lock1.locktype,lock1.database,lock1.relation,
postgres(# lock1.page,lock1.tuple,lock1.virtualxid,
postgres(# lock1.transactionid,lock1.classid,lock1.objid,
postgres(# lock1.objsubid) IS NOT DISTINCT FROM
postgres-# (lock2.locktype,lock2.DATABASE,
postgres(# lock2.relation,lock2.page,
postgres(# lock2.tuple,lock2.virtualxid,
postgres(# lock2.transactionid,lock2.classid,
postgres(# lock2.objid,lock2.objsubid)
postgres-# JOIN pg_catalog.pg_stat_activity stat2 on lock2.pid
postgres-# = stat2.pid
postgres-# WHERE NOT lock1.granted AND lock2.granted;
 blocker_pid | blocker_user |         blocker_statement          |    blocker_state    | blocked_pid | blocked_user |         blocked_statement          | blocked_state | blocked_duration 
-------------+--------------+------------------------------------+---------------------+-------------+--------------+------------------------------------+---------------+------------------
       28120 | pg121        | update t100 set id=222 where id=2; | idle in transaction |       29654 | pg121        | update t100 set id=222 where id=2; | active        | 00:31:48.504193
       28120 | pg121        | update t100 set id=222 where id=2; | idle in transaction |       28210 | pg121        | update t10 set id=1 where id=111;  | active        | 01:28:12.479294
(2 rows)

postgres=# 

 

### SQL Server 安装教程 SQL Server 是由 Microsoft 开发的关系型数据库管理系统 (RDBMS),广泛应用于企业级应用中。以下是 Windows 环境下 SQL Server 的详细安装步骤: #### 一、准备工作 1. **硬件和软件需求检查** - 内存:建议至少8GB以上,视业务量而定。 - CPU:支持64位处理器架构。 - 操作系统:Windows Server 或者较新版本的 Windows。 2. **下载安装包** 访问 [Microsoft 官方网站](https://www.microsoft.com/en-us/sql-server/sql-server-downloads) 下载适合您环境的 SQL Server 版本(如 Express、Standard 或 Enterprise),并选择合适的语言版本。 #### 二、安装过程 ##### 步骤 1:运行安装程序 双击已下载好的 .exe 文件启动 SQL Server Installation Center 向导界面。 ##### 步骤 2:选择“全新 SQL Server 单独安装” 此选项用于首次安装或添加功能到现有实例上;如果需要修复当前实例,则应选“升级”。 ##### 步骤 3:接受许可条款,并点击下一步继续。 ##### 步骤 4:产品密钥输入(仅限某些版本) 对于标准版及更高版本通常会要求输入有效的许可证密钥信息,Express 版免费提供基本特性则无需购买授权即可使用。 ##### 步骤 5:特征选择 这里可以勾选出想要安装的功能模块,默认情况下已经预选择了常用组件。可以根据实际项目需求自定义安装内容,比如是否包含 Reporting Services 报表服务等高级工具集。 ##### 步骤 6:配置服务器设置 指定实例名称、身份验证模式和服务账户权限等内容: - 实例名决定了该 SQL Server 实例在网络上的标识符; - 身份认证可以选择混合模式(即同时允许 SQL 和 Windows 登录)或是纯粹基于 Windows 用户的身份验证方式; - 设置好 sa 帐户密码以便后续管理操作时登录使用。(注意安全性) ##### 步骤 7:规则检测 这一步主要是为了确保所有必需条件都满足再继续下去。如果有不符合项,按照提示解决后再尝试通过校验。 ##### 步骤 8:开始复制文件&安装准备... 等待进度条完成整个部署流程... ##### 步骤 9:结束向导 当显示"成功完成了全部所需任务”字样之后关闭对话框就表示本次安装顺利完成啦! 最后别忘了重启计算机使得刚刚做的更改生效哦~ #### 三、连接测试与简单入门命令学习 完成后打开 SSMS(SQL Server Management Studio), 使用刚才设定好的凭据登陆试一下能否正常访问吧~ 推荐初学者们从 SELECT 查询语句学起,熟悉 T-SQL 语法结构有助于更快地上手实践工作。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值