PostgreSQL高并发单行更新发生死锁

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: 之前的一篇博客《PostgreSQL分区表的性能损耗验证》中,遇到100并发单行更新发生死锁(问题1)的问题。 这么简单的一条SQL,100个并发时居然会发生死锁,太不可思议了。发生死锁的SQLupdate_smallrange.
之前的一篇博客《PostgreSQL分区表的性能损耗验证》中,遇到100并发单行更新发生死锁(问题1)的问题。

这么简单的一条SQL,100个并发时居然会发生死锁,太不可思议了。
发生死锁的SQL
update_smallrange.sql:
  1. \setrandom id 1 10000
  2. update maintb set name = 'aaaaa12345' where id=:id;

服务端日志:
点击( 此处 )折叠或打开
  1. 2015-01-16 20:56:44.189 CST >错误: 检测到死锁
  2. 2015-01-16 20:56:44.189 CST >详细信息: 进程4880等待在事务 4074284上的ShareLock; 由进程4910阻塞.
  3.         进程4910等待在事务 4080369上的ShareLock; 由进程4880阻塞.
  4.         进程 4880: update maintb set name = 'aaaaa12345' where id=9692;
  5.         进程 4910: update maintb set name = 'aaaaa12345' where id=9692;
  6. 2015-01-16 20:56:44.189 CST >提示: 详细信息请查看服务器日志.
  7. 2015-01-16 20:56:44.189 CST >语句: update maintb set name = 'aaaaa12345' where id=9692;
从日志中可以看出,2个进程更新同一行记录时发生了死锁。
但是我的case也不是每次再现,之前测试的时候几乎100%的 再现概率,但是 过了几天,相同的环境却一次也没再现过。

今天偶然翻了下社区的邮件列表,发现这是个已知的BUG。
http://www.postgresql.org/message-id/20140731233051.GN17765@andrew-ThinkPad-X230

这个BUG报告中的错误消息有两种,其中一种和我的是一样的
死锁错误1:

点击(此处)折叠或打开

  1. 2014-07-30 09:41:54 PDT PID:4729 XID:25780 ERROR: deadlock detected
  2. 2014-07-30 09:41:54 PDT PID:4729 XID:25780 DETAIL: Process 4729 waits for ShareLock on transaction 25779; blocked by process 4727.
  3. 2014-07-30 09:41:54 PDT PID:4729 XID:25780 HINT: See server log for query details.
  4. 2014-07-30 09:41:54 PDT PID:4729 XID:25780 STATEMENT: UPDATE "z8z6px927zu6qzzbnb5ntgghxg"."access_grants" ag SET last_issued=DEFAULT FROM "z8z6px927zu6qzzbnb5ntgghxg"."oauth_clients" oc WHERE oc.id = ag.client_id AND ag.entity_name = 'user' AND ag.entity_id = 129 AND oc.client_id = '3hp45h9d4f9wwtx7cvpus6rdb4s5kb9f' RETURNING ag.id

死锁错误2:

点击(此处)折叠或打开

  1. 2014-07-30 09:41:56 PDT PID:4739 XID:25806 ERROR: deadlock detected
  2. 2014-07-30 09:41:56 PDT PID:4739 XID:25806 DETAIL: Process 4739 waits for ExclusiveLock on tuple (1,98) of relation 16553 of database 16385; blocked by process 4738.
  3. 2014-07-30 09:41:56 PDT PID:4739 XID:25806 HINT: See server log for query details.

这个BUG在9.3.x(9.3.4和9.3.5)上会存在,9.0和9.1等早期版本没有问题 。用我们公司的术语说就是LevelDown了。
点击( 此处 )折叠或打开
  1. I think this is a regression as we only see the behavior under
    postgres 9.3.x (reproduced locally on 9.3.4 and 9.3.5 in a VMWare VM
    running Ubuntu 11.04, but also evident in 9.3.3 on Amazon RDS). I am
    unable to reproduce in the earlier versions I've been able to test against
    (9.0.something and 9.1.9).

好消息是已经有这个BUG的Patch出来了,相信下次的PG版本发布会解决这个问题

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
7月前
|
缓存 NoSQL 关系型数据库
亿级电商流量,高并发下Redis与MySQL的数据一致性如何保证
你们有多少人是被面试官问到过Redis和MySQL的数据一致性如何保证的? 你们是否考虑过在高并发场景下,Redis与MySQL的同步会有哪些问题?该如何解决? 本篇文章会带大家详细了解,让你知其然,知其所以然,吊打面试官。
520 0
亿级电商流量,高并发下Redis与MySQL的数据一致性如何保证
|
5月前
|
SQL 关系型数据库 MySQL
(八)MySQL锁机制:高并发场景下该如何保证数据读写的安全性?
锁!这个词汇在编程中出现的次数尤为频繁,几乎主流的编程语言都会具备完善的锁机制,在数据库中也并不例外,为什么呢?这里牵扯到一个关键词:高并发,由于现在的计算机领域几乎都是多核机器,因此再编写单线程的应用自然无法将机器性能发挥到最大,想要让程序的并发性越高,多线程技术自然就呼之欲出,多线程技术一方面能充分压榨CPU资源,另一方面也能提升程序的并发支持性。
454 3
|
4月前
|
存储 SQL 关系型数据库
(二十一)MySQL之高并发大流量情况下海量数据分库分表的正确姿势
从最初开设《全解MySQL专栏》到现在,共计撰写了二十个大章节详细讲到了MySQL各方面的进阶技术点,从最初的数据库架构开始,到SQL执行流程、库表设计范式、索引机制与原理、事务与锁机制剖析、日志与内存详解、常用命令与高级特性、线上调优与故障排查.....,似乎涉及到了MySQL的方方面面。但到此为止就黔驴技穷了吗?答案并非如此,以《MySQL特性篇》为分割线,整个MySQL专栏从此会进入“高可用”阶段的分析,即从上篇之后会开启MySQL的新内容,主要讲述分布式、高可用、高性能方面的讲解。
298 1
|
4月前
|
SQL 关系型数据库 MySQL
(十六)MySQL调优篇:单机数据库如何在高并发场景下健步如飞?
在当前的IT开发行业中,系统访问量日涨、并发暴增、线上瓶颈等各种性能问题纷涌而至,性能优化成为了现时代中一个炙手可热的名词,无论是在开发、面试过程中,性能优化都是一个常谈常新的话题。而MySQL作为整个系统的后方大本营,由于是基于磁盘的原因,性能瓶颈往往也会随着流量增大而凸显出来。
564 0
|
6月前
|
Arthas 监控 Java
深入解析与解决高并发下的线程池死锁问题
在高并发的互联网应用中,遇到线程池死锁问题导致响应延迟和超时。问题源于库存服务的悲观锁策略和线程池配置不当。通过以下方式解决:1) 采用乐观锁(如Spring Data JPA的@Version注解)替换悲观锁,减少线程等待;2) 动态调整线程池参数,如核心线程数、最大线程数和拒绝策略,以适应业务负载变化;3) 实施超时和重试机制,减少资源占用。这些改进提高了系统稳定性和用户体验。
234 2
|
7月前
|
存储 关系型数据库 MySQL
《MySQL 入门教程》第 05 篇 账户和权限,Java高并发编程详解深入理解pdf
《MySQL 入门教程》第 05 篇 账户和权限,Java高并发编程详解深入理解pdf
|
关系型数据库 分布式数据库 数据库
沉浸式学习PostgreSQL|PolarDB 2: 电商高并发秒杀业务、跨境电商高并发队列消费业务
业务场景介绍: 高并发秒杀业务 秒杀业务在电商中最为常见, 可以抽象成热点记录(行)的高并发更新. 而通常在数据库中最细粒度的锁是行锁, 所以热门商品将会被大量会话涌入, 出现锁等待, 甚至把数据库的会话占满, 导致其他请求无法获得连接产生业务故障. 业务场景介绍: 高并发队列消费业务 在跨境电商业务中可能涉及这样的场景, 由于有上下游产业链的存在, 1、用户下单后, 上下游厂商会在自己系统中生成一笔订单记录并反馈给对方, 2、在收到反馈订单后, 本地会先缓存反馈的订单记录队列, 3、然后后台再从缓存取出订单并进行处理.
431 1
|
存储 数据采集 缓存
【运维知识进阶篇】Zabbix5.0稳定版详解9(Zabbix优化:高并发对MySQL进行拆分、Zabbix-agent主动上报模式、使用proxy代理模式、系统自带监控项优化、进程优化、缓存优化)
【运维知识进阶篇】Zabbix5.0稳定版详解9(Zabbix优化:高并发对MySQL进行拆分、Zabbix-agent主动上报模式、使用proxy代理模式、系统自带监控项优化、进程优化、缓存优化)
888 0
|
关系型数据库 MySQL Shell
Mysql数据库平滑扩容解决高并发和大数据量问题 3
Mysql数据库平滑扩容解决高并发和大数据量问题
117 1
|
druid 关系型数据库 MySQL
高并发下 MySQL Statement Cancellation Timer 的线程数暴涨
高并发下 MySQL Statement Cancellation Timer 的线程数暴涨