PostgreSQL高并发单行更新发生死锁 2015
来源:互联网 发布:w3cschool mysql 编辑:程序博客网 时间:2024/06/05 19:03
这么简单的一条SQL,100个并发时居然会发生死锁,太不可思议了。
发生死锁的SQL
update_smallrange.sql:
服务端日志:
点击(此处)折叠或打开从日志中可以看出,2个进程更新同一行记录时发生了死锁。
但是我的case也不是每次再现,之前测试的时候几乎100%的再现概率,但是过了几天,相同的环境却一次也没再现过。
今天偶然翻了下社区的邮件列表,发现这是个已知的BUG。
http://www.postgresql.org/message-id/20140731233051.GN17765@andrew-ThinkPad-X230
这个BUG报告中的错误消息有两种,其中一种和我的是一样的
死锁错误1:
死锁错误2:
这个BUG在9.3.x(9.3.4和9.3.5)上会存在,9.0和9.1等早期版本没有问题。用我们公司的术语说就是LevelDown了。
点击(此处)折叠或打开
好消息是已经有这个BUG的Patch出来了,相信下次的PG版本发布会解决这个问题。
发生死锁的SQL
update_smallrange.sql:
- \setrandom id 1 10000
- update maintb set name= 'aaaaa12345'where id=:id;
服务端日志:
点击(此处)折叠或打开
- < 2015-01-16 20:56:44.189 CST >错误: 检测到死锁
- < 2015-01-16 20:56:44.189 CST>详细信息: 进程4880等待在事务 4074284上的ShareLock; 由进程4910阻塞.
- 进程4910等待在事务 4080369上的ShareLock; 由进程4880阻塞.
- 进程 4880: update maintbset name = 'aaaaa12345' where id=9692;
- 进程 4910: update maintbset name = 'aaaaa12345' where id=9692;
- < 2015-01-16 20:56:44.189 CST>提示: 详细信息请查看服务器日志.
- < 2015-01-16 20:56:44.189 CST>语句: update maintb set name = 'aaaaa12345' where id=9692;
但是我的case也不是每次再现,之前测试的时候几乎100%的再现概率,但是过了几天,相同的环境却一次也没再现过。
今天偶然翻了下社区的邮件列表,发现这是个已知的BUG。
http://www.postgresql.org/message-id/20140731233051.GN17765@andrew-ThinkPad-X230
这个BUG报告中的错误消息有两种,其中一种和我的是一样的
死锁错误1:
点击(此处)折叠或打开
- 2014-07-30 09:41:54 PDT PID:4729 XID:25780 ERROR: deadlock detected
- 2014-07-30 09:41:54 PDT PID:4729 XID:25780 DETAIL: Process 4729 waits for ShareLock on transaction 25779; blocked by process 4727.
- 2014-07-30 09:41:54 PDT PID:4729 XID:25780 HINT: See server log for query details.
- 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_idAND ag.entity_name= 'user' AND ag.entity_id = 129 AND oc.client_id= '3hp45h9d4f9wwtx7cvpus6rdb4s5kb9f' RETURNING ag.id
死锁错误2:
点击(此处)折叠或打开
- 2014-07-30 09:41:56 PDT PID:4739 XID:25806 ERROR: deadlock detected
- 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.
- 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了。
点击(此处)折叠或打开
I think this is a regression as we only see the behavior underpostgres 9.3.x (reproduced locally on 9.3.4 and 9.3.5 in a VMWare VMrunning Ubuntu 11.04, but also evident in 9.3.3 on Amazon RDS). I amunable to reproduce in the earlier versions I've been able to test against(9.0.something and 9.1.9).
好消息是已经有这个BUG的Patch出来了,相信下次的PG版本发布会解决这个问题。
0 0
- PostgreSQL高并发单行更新发生死锁 2015
- 高并发update的 死锁产生原因
- java挑战高并发(9):死锁
- 理解高并发(4).死锁监测方法
- PostgreSQL 高并发任务分配系统 实践
- PostgreSQL 高并发任务分配系统 实践
- 多线程并发访问同一个对象时发生死锁的反思
- [think in java2] java 并发发生死锁的条件
- sql server在高并发状态下同时执行查询与更新操作时的死锁问题
- sql server在高并发状态下同时执行查询与更新操作时的死锁问题
- postgresql死锁
- postgresql 死锁
- 禁止死锁检测来提升高并发MySQL性能
- java高并发学习记录-死锁,活锁,饥饿
- 死锁-嵌套容易发生死锁
- PostgreSQL数据库 OLTP高并发请求性能优化
- PostgreSQL数据库 OLTP高并发请求性能优化
- 高并发下数据库丢失更新问题
- c++学习笔记(十):运算符重载综合——自定义数组类
- hash
- freeBSD的VNET_DEFINE跟SYSCTL_VNET_INT
- GCC编译流程分析
- springmvc中controller返回html页面时页面乱码解法
- PostgreSQL高并发单行更新发生死锁 2015
- ios页面传值
- poj1947 Rebuilding Roads
- Xcode 键盘不显示问题 即设置
- sublime text 2 调试python时结果空白
- postgresql常用命令
- iOS pch文件详解
- nyoj 21 三个水杯(广搜)
- Eclipse4.4.1安装velocity插件Veloeclipse.ui_2.0.8