PostgreSQL DBA(81) - Locks(FOR UPDATE SKIP LOCKED)
发表于:2025-02-06 作者:千家信息网编辑
千家信息网最后更新 2025年02月06日,本节介绍了PostgreSQL中的FOR UPDATE SKIP LOCKED,通过该Option可以提高某些场景下的并发性能.Session 1希望从tbl中id < 100的记录中随机选择一行:[
千家信息网最后更新 2025年02月06日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;BEGINTime: 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 | 1591locktype | relationrelation | tblmode | RowShareLockpage | tuple | virtualxid | transactionid | virtualtransaction | 3/2granted | tfastpath | tTime: 1.627 ms
假如Session 2也是希望从id < 100的记录中随机选择一行,但这时候会因为冲突而阻塞:
[local]:5432 pg12@testdb=# begin;BEGINTime: 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 | 1634locktype | relationrelation | tblmode | RowShareLockpage | tuple | virtualxid | transactionid | virtualtransaction | 4/16granted | tfastpath | t-[ RECORD 2 ]------+--------------------pid | 1591locktype | relationrelation | tblmode | RowShareLockpage | tuple | virtualxid | transactionid | virtualtransaction | 3/4granted | tfastpath | t-[ RECORD 3 ]------+--------------------pid | 1634locktype | tuplerelation | tblmode | AccessExclusiveLockpage | 0tuple | 1virtualxid | transactionid | virtualtransaction | 4/16granted | tfastpath | fTime: 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 | 1634locktype | relationrelation | tblmode | RowShareLockpage | tuple | virtualxid | transactionid | virtualtransaction | 4/17granted | tfastpath | t-[ RECORD 2 ]------+-------------pid | 1591locktype | relationrelation | tblmode | RowShareLockpage | tuple | virtualxid | transactionid | virtualtransaction | 3/4granted | tfastpath | tTime: 0.978 ms
参考资料
More concurrency: Improved locking in PostgreSQL
一行
信息
性能
选择
阻塞
参考资料
场景
而是
资料
冲突
参考
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
重任小说软件开发
服务器的光纤口
网络安全专业就业前景分析
谁会时时彩软件开发程序
天龙八部最新服务器
海南云生网络技术
不属于软件开发团队成员有哪些
删除服务器所有数据代码
3d打印和软件开发
参与网络安全有奖问答
深圳电话软件开发
趣拍网络技术
网络安全和信息化 中考
宁波宁海财务软件开发
上海电脑软件开发定做
星辰网络技术查询
网络安全培训 报道
java获取当前服务器名称
国家医保耗材数据库信息修改
网络安全监测系统驻点
使命召唤18北美服务器无法连接
河北家用软件开发制造价格
朱海虹浅谈网络安全
深圳电话软件开发
生意参谋数据库制作
分布式数据库好处
如何把小贷大数据库
软件开发运用的研究方法
网络技术运维是什么
竹韵网络安全吗