PostgreSQL/PPAS 一例死锁问题分析

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: PostgreSQL 死锁问题 本文分析在 PostgreSQL 发生的一例死锁问题 执行SQL 序列 表结构和数据 create table a(id int, value int); insert into a values(1,1); insert into

PostgreSQL 死锁问题

本文分析在 PostgreSQL 发生的一例死锁问题

执行SQL 序列

  1. 表结构和数据
    create table a(id int, value int);
    insert into a values(1,1);
    insert into a values(2,2);
  1. 事物隔离级别:读已提交
  2. 死锁发生的序列
#会话 1 开启一个事物
begin;

#会话 1 修改一行数据。修改成功,当前事物并未提交
update a set value = 3 where id = 1;

#会话 2 开启一个事物
begin;

#会话 2 修改一行数据。修改成功,当前事物并未提交
update a set value = 4 where id = 2;

# 会话 2 修改第二行数据
update a set value = 5 where id = 1;
# 由于这一行数据被会话 1 修改,且会话 1 所在事物状态未知
# 会话 2 挂起,等待会话 1 所在事物提交或回滚
# PostgreSQL 基于 MVCC 机制
# 如果会话 1 回滚,则该语句会在老数据(1)上修改;
# 如果会话 1 提交,则该语句会在新数据(3)上修改。

# 会话 1 修改第二行数据
update a set value = 6 where id = 2;
# 由于这一行数据被会话 2 修改,且会话 2 所在事物没有提交
# 会话 2 所在事物在等会话 1 的状态的确定,发生死锁
# PostgreSQL 死锁检测检测到死锁,介入处理,会话 1 所在事物被强制回滚
ERROR:  deadlock detected
DETAIL:  Process 24284 waits for ShareLock on transaction 2001; blocked by process 22401.
Process 22401 waits for ShareLock on transaction 2000; blocked by process 24284.
HINT:  See server log for query details.

# 此时会话 2 检测到会话 1 所在事物已回滚,则数据修改找到老版本的数据修改,update 语句执行完成。
postgres=# update a set value = 5 where id = 1;
UPDATE 1

问题分析

该问题是典型的 PostgreSQL 死锁问题

  1. 问题的原因是数据库会话间对数据库对象的循环上锁在成的
  2. PostgreSQL 的自动死锁检测机制能发现这类循环锁定,解决方法是一旦发生可能的死锁,就强制回滚可能造成死锁的会话的事物
  3. 用户在开发应用的过程中需要在特别注意上锁的顺序,否则在并发修改数据时容易造成死锁,导致性能低下
  4. 上述用例,如果所有回话加锁的顺序都是从小的 ID 到大的 ID,则不会发生死锁
  5. 同时,也可以使用意向锁来提前锁定需要修改的数据

相关资料

  1. Deadlocks
  1. select for update
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
SQL 存储 Oracle
19 PostgreSQL 锁类型,锁模式,锁冲突,死锁检测的介绍|学习笔记
快速学习19 PostgreSQL 锁类型,锁模式,锁冲突,死锁检测的介绍
551 0
19 PostgreSQL 锁类型,锁模式,锁冲突,死锁检测的介绍|学习笔记
|
SQL 算法 前端开发
开源分布式数据库PolarDB-X源码解读——PolarDB-X源码解读(六):分布式死锁检测
开源分布式数据库PolarDB-X源码解读——PolarDB-X源码解读(六):分布式死锁检测
339 0
|
关系型数据库 数据库 云计算
阿里云产品体系分为6大分类——云计算基础——数据库——关系型数据库——云数据库RDS PPAS版
阿里云产品体系分为6大分类——云计算基础——数据库——关系型数据库——云数据库RDS PPAS版自制脑图
165 1
阿里云产品体系分为6大分类——云计算基础——数据库——关系型数据库——云数据库RDS PPAS版
|
关系型数据库 PostgreSQL
《阿里云PostgreSQL、PPAS、HDB for PG生态、产品、案例、实践》电子版地址
阿里云PostgreSQL、PPAS、HDB for PG生态、产品、案例、实践
93 0
《阿里云PostgreSQL、PPAS、HDB for PG生态、产品、案例、实践》电子版地址
|
SQL NoSQL 关系型数据库
【巡检问题分析与最佳实践】PolarDB 死锁问题
死锁是关系型数据库系统中最为常见的错误,出现在不同事务中同时对某些数据访问加锁时都要等待对方请求中的数据而无法获取锁,数据库系统会自动牺牲回滚代价最小的事务,从而导致对应的写请求失败,更严重的情况是在大量死锁发生时,会导致数据库系统效率低下,堆积进程大量堆积引发性能问题。
【巡检问题分析与最佳实践】PolarDB 死锁问题
|
SQL Oracle 关系型数据库
xDB Replication Server - PostgreSQL, Oracle, SQL Server, PPAS 全量、增量(redo log based, or trigger based)同步(支持single-master, mult-master同步, 支持DDL)
xDB Replication Server - PostgreSQL, Oracle, SQL Server, PPAS 全量、增量(redo log based, or trigger based)同步(支持single-master, mult-master同步, 支持DDL)
795 0
|
SQL 弹性计算 监控
数据库RDS(mysql, sql server, postgresql, ppas, mariadb)支持的API
数据库RDS(mysql, sql server, postgresql, ppas, mariadb)的api
1704 0
|
SQL 存储 Oracle
PostgreSQL , EDB EPAS PPAS(兼容Oracle) , Oracle 对比(兼容性、特性优劣势) - 企业去O,去IOE
标签 PostgreSQL , PPAS , EPAS , edb , enterprisedb , Oracle , 兼容性 , 优缺点 背景 EPAS为EDB的PostgreSQL Oracle兼容企业版,基于PostgreSQL社区版本开发,2004年发布了第一个Oracle兼容版,已经在ORACLE兼容性上耕耘了15年。 2018年推出EPAS 11 版本,完成了 Oracle
2056 0
|
SQL Oracle 关系型数据库
xDB Replication Server - PostgreSQL, Oracle, SQL Server, PPAS 全量、增量(redo log based, or trigger based)同步(支持single-master, mult-master同步, 支持DDL)
标签 PostgreSQL , xDB replication server , sql server , oracle , ppas , 同步 , ddl , dml , 全量 , 增量 , log based , trigger based , smr(single-master replication) , mmr(multi-master replication) 背景 Post
510 0