本节介绍了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)相关推荐

  1. Postgresql skip locked跳过行锁消除行锁冲突等待

    场景如下: 如果某人申请一张卡,那么这张卡信息所在的行,都会加锁,以避免别人来申请同一张卡,如果别人同时也要申请一张卡,那么需要跳过加锁的卡,申请下一张无锁的卡,类似此场景都可以使用skip lock ...

  2. mysql update nowait_MySQL 8.0新特性 -- nowait以及skip locked

    如果某行记录被事务锁住了,select ... for update.或select ... for share事务对相同的行加锁的时候必须等待,直到产生阻塞的事务释放锁. 为了避免等待事务释放锁定的 ...

  3. mysql no wait_MySQL 8.0新特性 -- nowait以及skip locked

    如果某行记录被事务锁住了,select ... for update.或select ... for share事务对相同的行加锁的时候必须等待,直到产生阻塞的事务释放锁. 为了避免等待事务释放锁定的 ...

  4. PostgreSQL DBA最常用SQL

    PostgreSQL DBA最常用SQL 建立视图, 方便查询 create schema dba; create view dba.invalid_index as select indisvali ...

  5. 上市公司急聘:PostgreSQL DBA

    招聘职位: PostgreSQL DBA 公司介绍 赢时胜全称"深圳市赢时胜信息技术股份有限公司",创立于1998年,总部位于深圳,是目前国内知名的金融IT解决方案综合服务商,国家 ...

  6. postgresql 并发访问_postgresql 并发update下导致的死锁问题

    一.死锁问题背景 在收据批量打印时,由于采用异步并发触发打印,同时触发打印(九千多数据 每隔50ms触发一次),导致了并发执行引起在接口更新打印次数时postgresql发生死锁问题, 具体报错如下: ...

  7. PostgreSQL忘记输入where条件update更新整张表的解决办法

    2019独角兽企业重金招聘Python工程师标准>>> 虽然出现这个错误很挫,但有时候还是会被你或者你的同事碰到.为了避免这个错误,PostgreSQL数据库中可以通过触发器来解决, ...

  8. 史上最全:PostgreSQL DBA常用SQL查询语句(建议收藏学习)

    编者的话:PostgreSQL连续两年被评为年度数据库,备受很多DBA的青睐,本文我们一起来了解学习PostgreSQL常用的查询语句有哪些? 查看帮助命令 DB=# help --总的帮助 DB=# ...

  9. sql server与java实例_史上最全:PostgreSQL DBA常用SQL查询语句(建议收藏学习)

    活动预告:本周六,在北京将迎来一年一度的 ACOUG年会,在本次年会上,我们将对社区过去一年的工作进行回顾和梳理,并展望和探讨下一年工作的内容,同时,本次年会也开放了直播通道,名额不多,报名从速哦~ ...

最新文章

  1. 使用myeclipse的第一步
  2. java体重指数计算器程序_java 学习 ——计算器小程序
  3. golang 短连接和长连接 超时处理
  4. SEO(搜索引擎最佳化)简介
  5. 腾讯2019暑期实习生提前批CV岗笔试题
  6. Bootstrap4+MySQL前后端综合实训-Day08-PM【ajax获取表单标签内容、根据“栏目信息”添加“新闻信息”、新闻管理系统-项目展示】
  7. python rabitmq_python RabbitMQ队列使用
  8. 搭建hbase-0.94.26集群环境
  9. python 之 XML的基本应用总结
  10. Spring学习总结(28)——Spring获取request对象的几种方法及线程安全性总结
  11. MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令
  12. 从零开始搭二维激光SLAM --- 基于g2o的后端优化的代码实现
  13. 淘淘商城系列(一)—— 淘淘商城介绍(二)
  14. Oracle 常用函数/语法总结
  15. python兔子繁殖问题_【算法】兔子繁殖之斐波那契数列
  16. “道可道,非常道”——千年孤独话老子
  17. Ubuntu9.04 desktop下LAMP的安装与配置
  18. 主流云计算厂商产品服务介绍
  19. 数据模型 LP32 ILP32 LP64 ILP64 LLP64
  20. 运放的信号增益和噪声增益

热门文章

  1. 如何在微信环境中点击链接关注微信公众号
  2. Android底部菜单栏(图片+文字)
  3. 使用经验 1 C++程序由哪些部分构成
  4. 搞金融不能用mysql_金融行业数据库何去何从
  5. Fil真的要归零了吗?
  6. 机械计算机运算能力,人计算与机器计算的差别
  7. wandb报错:Exception: The wandb backend process has shutdown
  8. 外购计算机软件加速摊销的政策,固定资产或购入软件等可以加速折旧或摊销的优惠操作...
  9. 【Vtt2Srt】VTT转SRT工具 Vtt2Srt
  10. 增量式编码器与绝对值编码器的区别