PostgreSQL DBA(81) - Locks(FOR UPDATE SKIP LOCKED)
本节介绍了PostgreSQL中的FOR UPDATE SKIP LOCKED,通过该Option可以提高某些场景下的并发性能.
Session 1希望从tbl中id < 100的记录中随机选择一行:
[local]:5432 pg12@testdb=# select pg_backend_pid();pg_backend_pid
----------------1591
(1 row)
Time: 8.613 ms
[local]:5432 pg12@testdb=# begin;
BEGIN
Time: 4.527 ms
[local]:5432 pg12@testdb=#* select * from tbl where id in (1,2,3) limit 1 for update;id | c1 | c2 | c3 | c4 | c5
----+-----+-----+-----+----+----1 | c11 | c21 | c31 | | c3
(1 row)
Time: 1.450 ms
[local]:5432 pg12@testdb=#*
下面是该SQL的锁信息
[local]:5432 pg12@testdb=# select pid,locktype,relation::regclass,mode,page,tuple,virtualxid,transactionid,virtualtransaction,granted,fastpath from pg_locks where relation='tbl'::regclass;
-[ RECORD 1 ]------+-------------
pid | 1591
locktype | relation
relation | tbl
mode | RowShareLock
page |
tuple |
virtualxid |
transactionid |
virtualtransaction | 3/2
granted | t
fastpath | t
Time: 1.627 ms
假如Session 2也是希望从id < 100的记录中随机选择一行,但这时候会因为冲突而阻塞:
[local]:5432 pg12@testdb=# begin;
BEGIN
Time: 0.962 ms
[local]:5432 pg12@testdb=#* select * from tbl where id in (1,2,3) limit 1 for update;
相关锁信息:
[local]:5432 pg12@testdb=# select pid,locktype,relation::regclass,mode,page,tuple,virtualxid,transactionid,virtualtransaction,granted,fastpath from pg_locks where relation='tbl'::regclass;
-[ RECORD 1 ]------+--------------------
pid | 1634
locktype | relation
relation | tbl
mode | RowShareLock
page |
tuple |
virtualxid |
transactionid |
virtualtransaction | 4/16
granted | t
fastpath | t
-[ RECORD 2 ]------+--------------------
pid | 1591
locktype | relation
relation | tbl
mode | RowShareLock
page |
tuple |
virtualxid |
transactionid |
virtualtransaction | 3/4
granted | t
fastpath | t
-[ RECORD 3 ]------+--------------------
pid | 1634
locktype | tuple
relation | tbl
mode | AccessExclusiveLock
page | 0
tuple | 1
virtualxid |
transactionid |
virtualtransaction | 4/16
granted | t
fastpath | f
Time: 1.276 ms
PostgreSQL提供FOR UPDATE SKIP LOCKED,在Session 2获取一行时可跳过locked的行,从而提高并发性能
[local]:5432 pg12@testdb=#* select * from tbl where id in (1,2,3) limit 1 for update SKIP LOCKED;id | c1 | c2 | c3 | c4 | c5
----+-----+-----+-----+----+----2 | c12 | c22 | c32 | | c3
(1 row)
Time: 2.413 ms
可以看到,使用SKIP LOCKED选项,Session 2并没有被阻塞而是获取了没有locked的tuple.
这时候的锁信息如下:
[local]:5432 pg12@testdb=# select pid,locktype,relation::regclass,mode,page,tuple,virtualxid,transactionid,virtualtransaction,granted,fastpath from pg_locks where relation='tbl'::regclass;
-[ RECORD 1 ]------+-------------
pid | 1634
locktype | relation
relation | tbl
mode | RowShareLock
page |
tuple |
virtualxid |
transactionid |
virtualtransaction | 4/17
granted | t
fastpath | t
-[ RECORD 2 ]------+-------------
pid | 1591
locktype | relation
relation | tbl
mode | RowShareLock
page |
tuple |
virtualxid |
transactionid |
virtualtransaction | 3/4
granted | t
fastpath | t
Time: 0.978 ms
参考资料
More concurrency: Improved locking in PostgreSQL
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/6906/viewspace-2654113/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/6906/viewspace-2654113/
PostgreSQL DBA(81) - Locks(FOR UPDATE SKIP LOCKED)相关推荐
- Postgresql skip locked跳过行锁消除行锁冲突等待
场景如下: 如果某人申请一张卡,那么这张卡信息所在的行,都会加锁,以避免别人来申请同一张卡,如果别人同时也要申请一张卡,那么需要跳过加锁的卡,申请下一张无锁的卡,类似此场景都可以使用skip lock ...
- mysql update nowait_MySQL 8.0新特性 -- nowait以及skip locked
如果某行记录被事务锁住了,select ... for update.或select ... for share事务对相同的行加锁的时候必须等待,直到产生阻塞的事务释放锁. 为了避免等待事务释放锁定的 ...
- mysql no wait_MySQL 8.0新特性 -- nowait以及skip locked
如果某行记录被事务锁住了,select ... for update.或select ... for share事务对相同的行加锁的时候必须等待,直到产生阻塞的事务释放锁. 为了避免等待事务释放锁定的 ...
- PostgreSQL DBA最常用SQL
PostgreSQL DBA最常用SQL 建立视图, 方便查询 create schema dba; create view dba.invalid_index as select indisvali ...
- 上市公司急聘:PostgreSQL DBA
招聘职位: PostgreSQL DBA 公司介绍 赢时胜全称"深圳市赢时胜信息技术股份有限公司",创立于1998年,总部位于深圳,是目前国内知名的金融IT解决方案综合服务商,国家 ...
- postgresql 并发访问_postgresql 并发update下导致的死锁问题
一.死锁问题背景 在收据批量打印时,由于采用异步并发触发打印,同时触发打印(九千多数据 每隔50ms触发一次),导致了并发执行引起在接口更新打印次数时postgresql发生死锁问题, 具体报错如下: ...
- PostgreSQL忘记输入where条件update更新整张表的解决办法
2019独角兽企业重金招聘Python工程师标准>>> 虽然出现这个错误很挫,但有时候还是会被你或者你的同事碰到.为了避免这个错误,PostgreSQL数据库中可以通过触发器来解决, ...
- 史上最全:PostgreSQL DBA常用SQL查询语句(建议收藏学习)
编者的话:PostgreSQL连续两年被评为年度数据库,备受很多DBA的青睐,本文我们一起来了解学习PostgreSQL常用的查询语句有哪些? 查看帮助命令 DB=# help --总的帮助 DB=# ...
- sql server与java实例_史上最全:PostgreSQL DBA常用SQL查询语句(建议收藏学习)
活动预告:本周六,在北京将迎来一年一度的 ACOUG年会,在本次年会上,我们将对社区过去一年的工作进行回顾和梳理,并展望和探讨下一年工作的内容,同时,本次年会也开放了直播通道,名额不多,报名从速哦~ ...
最新文章
- 使用myeclipse的第一步
- java体重指数计算器程序_java 学习 ——计算器小程序
- golang 短连接和长连接 超时处理
- SEO(搜索引擎最佳化)简介
- 腾讯2019暑期实习生提前批CV岗笔试题
- Bootstrap4+MySQL前后端综合实训-Day08-PM【ajax获取表单标签内容、根据“栏目信息”添加“新闻信息”、新闻管理系统-项目展示】
- python rabitmq_python RabbitMQ队列使用
- 搭建hbase-0.94.26集群环境
- python 之 XML的基本应用总结
- Spring学习总结(28)——Spring获取request对象的几种方法及线程安全性总结
- MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令
- 从零开始搭二维激光SLAM --- 基于g2o的后端优化的代码实现
- 淘淘商城系列(一)—— 淘淘商城介绍(二)
- Oracle 常用函数/语法总结
- python兔子繁殖问题_【算法】兔子繁殖之斐波那契数列
- “道可道,非常道”——千年孤独话老子
- Ubuntu9.04 desktop下LAMP的安装与配置
- 主流云计算厂商产品服务介绍
- 数据模型 LP32 ILP32 LP64 ILP64 LLP64
- 运放的信号增益和噪声增益
热门文章
- 如何在微信环境中点击链接关注微信公众号
- Android底部菜单栏(图片+文字)
- 使用经验 1 C++程序由哪些部分构成
- 搞金融不能用mysql_金融行业数据库何去何从
- Fil真的要归零了吗?
- 机械计算机运算能力,人计算与机器计算的差别
- wandb报错:Exception: The wandb backend process has shutdown
- 外购计算机软件加速摊销的政策,固定资产或购入软件等可以加速折旧或摊销的优惠操作...
- 【Vtt2Srt】VTT转SRT工具 Vtt2Srt
- 增量式编码器与绝对值编码器的区别