PostgreSQL DBA(177) - Serializability Isolation(Index vs NonIndex)
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,PostgreSQL 9.1或以上版本,提供了真正意义的Serializability Isolation,本节主要介绍了Serializability Isolation下有索引与没有索引的区别。N
千家信息网最后更新 2025年02月01日PostgreSQL DBA(177) - Serializability Isolation(Index vs NonIndex)
PostgreSQL 9.1或以上版本,提供了真正意义的Serializability Isolation,本节主要介绍了Serializability Isolation下有索引与没有索引的区别。
NonIndex
在没有索引的情况下,对relation进行w(写)操作,PG会对整个relation加SIReadLock,因为加锁粒度是Relation级别,因此如果其他session也对这个表进行w操作,那么两个session之间会出现rw依赖循环,其中一个session会被终止。
-- Session 1[local:/data/run/pg12]:5120 pg12@testdb=# show default_transaction_isolation; default_transaction_isolation------------------------------- serializable(1 row)[local:/data/run/pg12]:5120 pg12@testdb=# begin;BEGIN[local:/data/run/pg12]:5120 pg12@testdb=#* select * from tbl where id = 1; id | c1----+---------------------- 1 | x(1 row)
查询锁信息,在relation上加SIReadLock
[local:/data/run/pg12]:5120 pg12@testdb=# select pid,locktype,relation::regclass,page,tuple,transactionid,mode,granted,fastpath from pg_locks where pid = 22365; pid | locktype | relation | page | tuple | transactionid | mode | granted | fastpath-------+------------+----------+------+-------+---------------+-----------------+---------+---------- 22365 | relation | tbl | | | | AccessShareLock | t | t 22365 | virtualxid | | | | | ExclusiveLock | t | t 22365 | relation | tbl | | | | SIReadLock | t | f(3 rows)
-- Session 1[local:/data/run/pg12]:5120 pg12@testdb=#* update tbl set c1='x' where id = 1;UPDATE 1[local:/data/run/pg12]:5120 pg12@testdb=#* commit;COMMIT[local:/data/run/pg12]:5120 pg12@testdb=#-- Session 2[local:/data/run/pg12]:5120 pg12@testdb=# begin;BEGIN[local:/data/run/pg12]:5120 pg12@testdb=#* update tbl set c1 = 'x' where id = 2;UPDATE 1[local:/data/run/pg12]:5120 pg12@testdb=#* commit;ERROR: could not serialize access due to read/write dependencies among transactionsDETAIL: Reason code: Canceled on identification as a pivot, during commit attempt.HINT: The transaction might succeed if retried.[local:/data/run/pg12]:5120 pg12@testdb=#
操作过程如下:
时间点 | T1 | T2 |
---|---|---|
t1 | begin; | |
t2 | begin; | |
t3 | update tbl set c1 = 'x' where id = 1; | |
t4 | begin; | |
t5 | update tbl set c1 = 'x' where id = 2; | |
t6 | commit; | |
t7 | commit; |
Index
在存在索引的情况下,对relation进行w(写)操作,PG会对page加SIReadLock,只会影响到tuple所在的page。
[local:/data/run/pg12]:5120 pg12@testdb=# create table tbl_index(id int ,c1 varchar);CREATE TABLE [local:/data/run/pg12]:5120 pg12@testdb=# insert into tbl_index select x,x from generate_series(1,100000) x;INSERT 0 100000[local:/data/run/pg12]:5120 pg12@testdb=# create index idx_tbl_index_id on tbl_index(id);CREATE INDEX[local:/data/run/pg12]:5120 pg12@testdb=# select id,ctid from tbl_index where id in(1,20000); id | ctid-------+---------- 1 | (0,1) 20000 | (107,24)(2 rows)
id为1和20000的tuple位于不同的page中,下面对这两条记录进行更新
-- session 1[local:/data/run/pg12]:5120 pg12@testdb=# begin;BEGIN[local:/data/run/pg12]:5120 pg12@testdb=#* update tbl_index set c1='x' where id = 1;UPDATE 1[local:/data/run/pg12]:5120 pg12@testdb=#*-- session 2[local:/data/run/pg12]:5120 pg12@testdb=# begin;BEGIN[local:/data/run/pg12]:5120 pg12@testdb=#* update tbl_index set c1='x' where id = 20000;UPDATE 1[local:/data/run/pg12]:5120 pg12@testdb=#* select pg_backend_pid(); pg_backend_pid---------------- 22425(1 row)[local:/data/run/pg12]:5120 pg12@testdb=#*
锁信息,注意:锁定的page是index的page而不是heap page
[local:/data/run/pg12]:5120 pg12@testdb=# select pid,locktype,relation::regclass,page,tuple,transactionid,mode,granted,fastpath from pg_locks where pid = 22365; pid | locktype | relation | page | tuple | transactionid | mode | granted | fastpath-------+---------------+------------------+------+-------+---------------+------------------+---------+---------- 22365 | relation | idx_tbl_index_id | | | | RowExclusiveLock | t | t 22365 | relation | tbl_index | | | | RowExclusiveLock | t | t 22365 | virtualxid | | | | | ExclusiveLock | t | t 22365 | transactionid | | | | 423265 | ExclusiveLock | t | f 22365 | page | idx_tbl_index_id | 1 | | | SIReadLock | t | f(5 rows)[local:/data/run/pg12]:5120 pg12@testdb=# select pid,locktype,relation::regclass,page,tuple,transactionid,mode,granted,fastpath from pg_locks where pid = 22425; pid | locktype | relation | page | tuple | transactionid | mode | granted | fastpath-------+---------------+------------------+------+-------+---------------+------------------+---------+---------- 22425 | relation | idx_tbl_index_id | | | | RowExclusiveLock | t | t 22425 | relation | tbl_index | | | | RowExclusiveLock | t | t 22425 | virtualxid | | | | | ExclusiveLock | t | t 22425 | transactionid | | | | 423266 | ExclusiveLock | t | f 22425 | page | idx_tbl_index_id | 56 | | | SIReadLock | t | f(5 rows)
提交事务,两个session均成功
-- session 1[local:/data/run/pg12]:5120 pg12@testdb=#* commit;COMMIT-- session 2[local:/data/run/pg12]:5120 pg12@testdb=#* commit;COMMIT
索引
两个
信息
情况
不同
成功
下有
之间
事务
意义
所在
时间
版本
粒度
级别
过程
影响
循环
更新
查询
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
es传统数据库
数据库技术函数count
计算机网络技术网课资源
浙江都可拉网络技术有限公司
linux 服务器 配置
非洲互联网科技产业
安全播出网络安全培训
python 轻量数据库
服务器管理器怎么开始远程
陈继军 网络安全
win服务器ftp自动同步
sql取两个表相同的数据库
计算机网络技术方面资料
重庆地区银行软件开发
营口网络安全宣传周
网络安全工程师培训视频
青浦区什么是软件开发服务保障
建立客户关系数据库
外网访问局域网数据库
服务器后面没有vga口
数据库应用技术属于什么系
权力软件开发
四川交友软件开发多少钱
软件开发里的重要里程碑节点
陈继军 网络安全
信誉可靠的软件开发培训
兰州有软件开发公司
软件开发违约金怎么算
网络安全及信息化是做什么
赛亚科技网络安全