本文实例讲述了PostgreSQL数据库事务实现方法。分享给大家供大家参考,具体如下:
事务简介
事务是所有数据库系统的一个基本概念。 一次事务的要点就是它把多个步骤捆绑成了一个单一的,不成功则成仁的操作。 其它并发的事务是看不到在这些步骤之间的中间状态的,并且如果发生了一些问题, 导致该事务无法完成,那么所有这些步骤都完全不会影响数据库。PostgreSQL为每条事务创建一个postgre进程,并发执行事务。采用分层的机制执行事务,上层事务块和底层事务。上层事务块是用户眼中的事务,用于控制事务执行的状态;底层事务是事务中的每条语句,可以改变上层事务块的状态。
上层事务块
每个postgre进程只有一个事务块,上层事务块记录着本次事务执行过程中的各个状态。
typedef enum TBlockState { /* not-in-transaction-block states */ TBLOCK_DEFAULT, /* idle */ TBLOCK_STARTED, /* 执行简单查询事务 */ /* transaction block states */ TBLOCK_BEGIN, /* 遇见事务开始BEGIN */ TBLOCK_INPROGRESS, /* 事务正在执行中 */ TBLOCK_PARALLEL_INPROGRESS, /* live transaction inside parallel worker */ TBLOCK_END, /* 遇见事务结束COMMIT/END的时候设置 */ TBLOCK_ABORT, /* 事务出错,等待ROLLBACK */ TBLOCK_ABORT_END, /* 事务出错,收到ROLLBACK */ TBLOCK_ABORT_PENDING, /* 事务处理中,接收到ROLLBACK */ TBLOCK_PREPARE, /* 事务处理中,收到PREPARE(分布式事务) */ /* subtransaction states */ TBLOCK_SUBBEGIN, /* starting a subtransaction */ TBLOCK_SUBINPROGRESS, /* live subtransaction */ TBLOCK_SUBRELEASE, /* RELEASE received */ TBLOCK_SUBCOMMIT, /* COMMIT received while TBLOCK_SUBINPROGRESS */ TBLOCK_SUBABORT, /* failed subxact, awaiting ROLLBACK */ TBLOCK_SUBABORT_END, /* failed subxact, ROLLBACK received */ TBLOCK_SUBABORT_PENDING, /* live subxact, ROLLBACK received */ TBLOCK_SUBRESTART, /* live subxact, ROLLBACK TO received */ TBLOCK_SUBABORT_RESTART /* failed subxact, ROLLBACK TO received */ } TBlockState;
常见的事务块状态转换图
底层事务
底层事务是需要执行的每条命令,负责处理资源和锁的获取和释放,信号的处理,日志记录等等
typedef enum TransState { TRANS_DEFAULT, /* idle */ TRANS_START, /* transaction starting */ TRANS_INPROGRESS, /* inside a valid transaction */ TRANS_COMMIT, /* commit in progress */ TRANS_ABORT, /* abort in progress */ TRANS_PREPARE /* prepare in progress */ } TransState;
主要有四个函数:
分布式事务
PostgreSQL提供了分布式事务中的,两阶段提交的接口
并发控制
PostgreSQL采用MVCC的方式进行并发控制,每个事务看到的是一段时间前的数据快照。同时,MVCC并不能够解决所有问题,所以也提供了行级和表级的锁。
标准的事务隔离级别有4个,而PostgreSQL只实现了读已提交和可串行化。
锁
PostgreSQL实现了8种锁(可怕)
太多了,就记住几个吧。
加锁的对象
死锁处理
MVCC
关键词:
typedef struct HeapTupleFields { TransactionId t_xmin; /* Insert,Update事务 */ TransactionId t_xmax; /* Delete,Update,Row Locks事务ID */ union { CommandId t_cid; /* 操作ID */ TransactionId t_xvac; /* old-style VACUUM FULL xact ID */ } t_field3; } HeapTupleFields;
cmin:插入该元组的命令在插入事务中的命令标识(从0开始累加)
cmax:删除该元组的命令在插入事务中的命令标识(从0开始累加)
ctid:相当于rowid , <数据块ID,偏移量>
XID:事务ID
Xid_snapshot:当前系统中未提交的事务
CLOG:事务状态日志(已提交的日志)
隔离级别
数据可见性判断
多行数据需要过期版本回收
日志
希望本文所述对大家PostgreSQL数据库程序设计有所帮助。
本文向大家介绍PostgreSQL数据库事务出现未知状态的处理方法,包括了PostgreSQL数据库事务出现未知状态的处理方法的使用技巧和注意事项,需要的朋友参考一下 背景 数据库的事务是原子操作,要么成功,要么失败。但是实际上在客户端的视角,可能有第三种状态:unknown状态。 当客户端提交事务结束(rollback , commit , prepare xact , rollback pxa
我一直试图运行事务方法,但它无法在firebase数据库中获取和设置正确的数据。 代码如下:
本文向大家介绍asp.net实现access数据库分页的方法,包括了asp.net实现access数据库分页的方法的使用技巧和注意事项,需要的朋友参考一下 asp.net操作access数据库是常见的数据库操作应用,本文就来实例讲解一下asp.net实现access数据库分页的方法。希望对大家的asp.net程序设计能有所帮助。 具体实例代码如下: 相信本文实例能对大家的asp.net程序设计带来
本文向大家介绍MongoDB数据库两阶段提交实现事务的方法详解,包括了MongoDB数据库两阶段提交实现事务的方法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了MongoDB数据库两阶段提交实现事务的方法。分享给大家供大家参考,具体如下: MongoDB数据库中操作单个文档总是原子性的,然而,涉及多个文档的操作,通常被作为一个“事务”,而不是原子性的。因为文档可以是相当复杂并且包含多
我正在尝试创建一个数据库,然后在其中创建一个表。我使用docker-compose.yml在一个sql文件中编写了查询,以便与postgres图像一起使用 当我尝试使用docker compose build,然后使用docker compose up时,我得到一个错误 “psql:/docker entrypoint initdb.d/init.sql:18:错误:未实现跨数据库引用:“real
本文向大家介绍Android开发中的数据库事务用法分析,包括了Android开发中的数据库事务用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android开发中的数据库事务用法。分享给大家供大家参考,具体如下: 在android应用程序开发中,在使用到数据库的时候,事务处理是非常重要的。 首先Android数据库操作(特别是写操作)是非常慢的,将所有操作打包成一个事务能大大提高处