![](https://img-blog.csdnimg.cn/direct/704b7bae5daf435baeba827ef3441a07.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
PostgreSQL之事务、并发和锁
文章平均质量分 88
涉及PostgreSQL数据库事务、并发和锁的ACID、锁等待、各级别锁等的方方面面。
瀚高PG实验室
瀚高PG实验室(Highgo PG Lab)依托于瀚高DBA运维团队及瀚高数据库PG内核研发团队,旨在深入研究PostgreSQL技术、使用技巧、内核探秘、PG教学等,并进行分享。欢迎大家关注、交流。
展开
-
PostgreSQL中的多版本并发控制
多版本并发控制的原理在并发操作中,当正在写时,如果用户在读,可能会产生数据不一致的问题。比如一行的前半部分刚写入,后半部分还没有写入,这时读的人可能读取到的数据行,其前半部分数据是新的,后半部分数据是旧的,这样就导致了数据一致性问题。解决这个问题最简单的办法是使用读写锁。写的时候,不允许读,正在读的时候也不允许写,但这种方法导致读和写不能并发。于是,有人想到了一种能够让读写并发的方法(MVCC原创 2018-01-24 22:46:43 · 1646 阅读 · 0 评论 -
定位数据库里的长事务语句之一
定位数据库里的长事务SELECTclient_addr, usename, datname,clock_timestamp() - xact_start AS xact_age,clock_timestamp() - query_start AS query_age,state, queryFROM pg_stat_activity ORDER BY coalesce(xact_sta翻译 2018-01-08 18:05:58 · 1561 阅读 · 0 评论 -
hot_standby_feedback参数的使用
在同步流复制的时候通过备端进行查询可能会出现如下情况:错误: 40001: 由于与恢复操作冲突,正在取消语句命令Detail:用户查询可能需要看到而必须被删除的行版本号这时候通过在备机上面设置参数hot_standby_feedback = 'on'可以解决此问题。我们先来看看另一个参数:vacuum_defer_cleanup_age (integer)Spec原创 2018-01-11 09:44:00 · 1779 阅读 · 0 评论 -
psql: could not connect to server的一种浅显可能
我们在使用postgresql数据库的时候经常遇到的问题:[highgo@hgdb ~]$ psqlpsql: could not connect to server: No such file or directoryIs the server running locally and acceptingconnections on Unix domain socket "/tmp/原创 2018-01-11 09:03:29 · 6463 阅读 · 0 评论 -
查看PostgreSQL数据库中的锁等待--脚本
select w1.pid as waiting_pid,w2.usename as waiting_user,w2.query as waiting_statement,b1.pid as blocking_pid,b2.usename as blocking_user,b2.query as blocking_statementfrom pg_locks w1join pg_st原创 2017-12-06 09:52:33 · 1808 阅读 · 0 评论 -
Canceling statement due to conflict with recovery
在PostgreSQL流复制环境下,备用服务器上进行查询时,日志输出中可能会出现这类报错。问题原因当备用服务器在WAL流中获取更新/删除,而且该更新/删除将使正在运行的查询当前正在访问的数据无效,在这种情况下将发生此类错误。例如,主服务器在备用服务器正在查询的表上运行DROP TABLE命令。显然,此时备用服务器上的查询无法继续。当在主服务器上运行DROP TABLE命令时,它不会等待...原创 2019-02-15 09:29:33 · 2883 阅读 · 0 评论 -
PostgreSQL中的数据对齐
当数据对齐时,CPU可以有效地执行对内存的读写操作。因此,PostgreSQL中的每种数据类型都有特定的对齐要求。 当多个属性连续存储在元组中时,在属性之前插入填充。理解这些对齐要求有助于最小化在磁盘上存储元组时所需的填充量,从而节省磁盘空间。Postgres中的数据类型分为以下几类:1)按值传递,固定长度:通过值传递给Postgres内部例程并具有固定长度的数据类型属于此类别。长度可以是...原创 2019-02-15 11:24:24 · 1142 阅读 · 0 评论 -
PostgreSQL建立索引避免锁表
正常情况下Postgresql建立普通btree索引时会阻塞DML(insert,update,delete)操作,直到索引完成,期间读操作不受阻塞。oracle数据库有在线创建的选项online。Postgresql也提供了相关的功能concurrently,使用方法:create index concurrently index_name on tablename();使用co...原创 2018-05-03 06:48:44 · 4168 阅读 · 0 评论 -
pg_locks视图(一)
pg_locks视图是对查询无响应时需要查询的重要视图,其各字段机器含义如下:名字类型引用描述locktypetext可锁定对象的类型:relation,extend,page,tuple,transactionid,object, 或者userlockdatabas原创 2018-02-07 14:50:12 · 2766 阅读 · 0 评论 -
PostgreSQL 之 锁机制
当要增删改查表中的数据时,首先是要获得表上的锁,然后再获得行上的锁postgresql中有8种表锁最普通的是共享锁 share 和排他锁 exclusive因为多版本的原因,修改一条语句的同时,允许了读数据,为了处理这种情况,又增加了两种锁”access share”和”acess excusive”,锁中的关键字 access 是与多版本相关的为了处理表锁和行锁之间的关系,有了 意向锁 的...原创 2018-02-28 17:45:14 · 7430 阅读 · 1 评论 -
PostgreSQL 之 锁的查看
要查看pg中的锁,需要查看pg_locks这个视图pg_locks字段名称类型引用描述locktypetext可锁对象的类型: relation, extend, page, tuple, transactionid, virtualxid, object, userlock, or advisorydatabaseoidg_database.oid锁目标存在的数据库的OID,如果目标是一个共...原创 2018-02-28 17:42:42 · 26828 阅读 · 1 评论 -
postgresql拨云见日之锁的理解(一)
锁对于数据库而言几乎是不可避免的,那么对锁的理解也就显得尤为重要了。比如哪个事务被哪个事务阻塞了,为什么阻塞了,谁阻塞的,具体在那个表哪一行?想要理解锁,就要先了解系统视图pg_locks各个列的解释可查看我前面分享的pg_locks视图:http://blog.csdn.net/pg_hgdb/article/details/79280086理解视图之前我们先来了解虚拟事务ID(virtualx...原创 2018-03-06 15:06:26 · 2246 阅读 · 0 评论 -
PostgreSQL中的死锁
PostgreSQL通过使用称为MVCC(多版本并发控制)的方法实现并发控制。在此方法中,当正在更新项目时,更改将不会覆盖原始数据,而是将创建项目的新版本(带有更改)。因此,我们将存储多个版本的项目。这种模型的主要优点之一是为查询(读取)数据而获取的锁与写入数据时获取的锁不冲突,因此读取永远不会阻止写入,写入也从不阻止读取。但是,如果存储了同一项目的多个版本,那么事务看到的是哪个版本呢?这里需要回...原创 2018-09-30 14:34:00 · 2766 阅读 · 0 评论 -
PostgreSQL之 事务的提交与回滚
在PostgreSQL的psql中,如果执行一个dml或ddl语句,没有先运行begin;的话,一执行完就马上提交了,不能回滚,这样容易导致误操作的发生,避免这个风险的办法是关闭自动提交,方法如下:设置\set AUTOCOMMIT offtestdb=# create table tt1(x int);CREATE TABLETime: 0.593 mstestdb=# select * f...原创 2018-02-11 14:17:12 · 25703 阅读 · 0 评论 -
从并发控制(MVCC)角度看deadtuple死数据的产生
作者:瀚高PG实验室(Highgo PG Lab)-Chrisx从并发控制(MVCC)角度看deadtuple死数据的产生文章目录从并发控制(MVCC)角度看deadtuple死数据的产生tuple结构tuple增删改及dead tuple产生1. Insert2. delete3. updatetuple结构数据结构 HeapTupleHeaderData 是多版本并发控制的核心数据结构t_xmint_xmaxt_cidt_c原创 2021-06-01 17:40:37 · 984 阅读 · 0 评论 -
事务回卷浅析
作者:瀚高PG实验室(Highgo PG Lab)-Chrisx事务回卷浅析文章目录事务回卷浅析事务ID(txid)事务可比较事务空间事务回卷防止事务回卷在这里,我们描述事务ID回卷问题。事务ID(txid)每当事务开始时,由事务管理器分配一个唯一标识符 事务id(txid)。PostgreSQL的txid是一个32位无符号整数,约为42亿。如果在事务开始后调用内部函数 txid_current(),则返回当前的txid,如下所示。testdb=# BEGIN;BEGINtest=>原创 2021-06-01 17:38:11 · 1349 阅读 · 0 评论 -
LSN与段文件的关系
作者:瀚高PG实验室(Highgo PG Lab)-ChrisxLSN与段文件的关系文章目录LSN与段文件的关系LSNLSN与段文件LSNLSN 是一个指向WAL中的位置的指针在内部,一个 LSN 是一个 64 位整数,表示在预写式日志流中的一个字节位置。它被打印成 两个最高 8 位的十六进制数,中间用斜线分隔,例如16/B374D848。 pg_lsn类型支持标准的比较操作符,如=和 >。两个 LSN 可以用-操作符做减法, 结果将是分隔两个预写式日志位置的字节数。LSN与段文件通过原创 2021-06-01 17:29:41 · 1107 阅读 · 0 评论 -
PostgreSQL中的并行查询
作者:瀚高PG实验室(HighgoPGLab) 丹心明月注:本文章主要翻译自《PostgreSQL 13.0 Documentation》第十五章PostgreSQL可生成使用多个CPU的查询计划,以更快的运行查询,即并行查询。有些查询并不能使用并行查询,或许是因为当前并行查询实现的限制,或许是因为没有比串行执行更好的选择。不过,对于那些可以使用并行查询的语句,获得的性能提高是显著的。那些需要检索很多数据但仅需返回几行的查询,性能提升最为明显。本章就并行查询的工作原理及使用场景进行了简单介绍..翻译 2021-02-08 13:51:20 · 2499 阅读 · 0 评论 -
PostgreSQL的并发控制
第十三章 PostgreSQL的并发控制作者:瀚高PG实验室(HighgoPGLab) 丹心明月注:本文章主要翻译自《PostgreSQL 13.0 Documentation》第十三章本章介绍当多个会话同时尝试对相同数据进行访问时,PostgreSQL的行为。在此情形,目标是,在保证数据严格一致性的前提下,尽可能保证访问有效率。所有数据库应用程序开发者均需熟悉此章所述内容。13.1并发控制简介PostgreSQL提供了多种方式以控制对数据的并发访问。在数据库内部,数据的一致...翻译 2021-02-03 15:53:36 · 2365 阅读 · 0 评论 -
PostgreSQL之事务
By 瀚高...原创 2020-12-16 12:53:31 · 1681 阅读 · 0 评论