Postgresql MVCC机制源码初探

PostgreSql零基础入门 PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的BSD许可证下发行。PostgreSQL 开发者把它念作 post-gress-Q-L。PostgreSQL 的 Slogan 是 “世界上最先进的开源关系型数据库”。PostgreSQL官网PostgreSQL中文社区全球数据库排行国产数据库排行‘’PostgreSQL学习目录Postgres遵守BSD许可证发行,使开发者们得以获取源代码并进一步开发系统。 阅读详情

Postgresql MVCC机制源码初探

MVCC(Multi-Version Concurrency Control多版本并发控制)机制几乎是每个数据库的标配,那么postgresql的mvcc机制是怎么实现的?我们从几个简单语句作为切入点,初步了解下相关代码。

以postgresql最常用的RC 隔离级别为例,sessionA session B分别为两个连接会话,前面的数字为语句执行先后顺序,现在已经有一个表t1,有一个列col,插入了一行记录1,再按如下表格中语句顺序执行:

 

Session A

Session B

1  begin;

BEGIN

insert into t1 values(2);

3select xmax,xmin,*from t1;

  commit;

 

2 select xmax,xmin,*from t1;

4 select xmax,xmin,*from t1;

 

第1步中语句执行后,又插了一条记录2,再在session B中执行第2步,显然我们是只能查到一条记录如下:

postgres=#select xmax,xmin,*from t1;

 xmax | xmin | col

------+------+-----

    0 | 553 |   1

(1 row)

但是,此时在buffer中t1表的页面上是有两条记录的,只是另外一条对Session B来说不可见。由于原来的记录1先插入,那么在页面上指向真实元组的页内指针在前面,而记录2在后面,因此会先扫描到记录1,那么执行到第2步时,会对每一条记录都做可见性检查判断。

在HeapTupleSatisfiesMVCC接口中判断是否可见,第一条记录判断流程如下:

bool
HeapTupleSatisfiesMVCC(HeapTuple htup, Snapshot snapshot,
					   Buffer buffer)
{
	HeapTupleHeader tuple = htup->t_data;
	....
	if (!HeapTupleHeaderXminCommitted(tuple))	//xmin插入事务是否提交,第一条已经提交,因此这里不能进入,跳过
	{
		....
	}
	else
	{
		/* xmin is committed, but maybe not according to our snapshot */
		if (!HeapTupleHeaderXminFrozen(tuple) &&
			XidInMVCCSnapshot(HeapTupleHeaderGetRawXmin(tuple), snapshot))	//此处不成立,继续往下执行
			return false;		/* treat as still in progress */
	}

	if (tuple->t_infomask & HEAP_XMAX_INVALID)    //成立,返回true,如果插入事务已经commit,而没有进行过delete操作,那是可见的
		return true;
	.....
}

再看第二条记录判断流程:
bool
HeapTupleSatisfiesMVCC(HeapTuple htup, Snapshot snapshot,
					   Buffer buffer)
{
	HeapTupleHeader tuple = htup->t_data;
	...
	if (!HeapTupleHeaderXminCommitted(tuple))  //进入,插入事务未提交
	{
		if (HeapTupleHeaderXminInvalid(tuple))   //非invalid,跳过
			return false;

		/* Used by pre-9.0 binary upgrades */
		if (tuple->t_infomask & HEAP_MOVED_OFF)   //非HEAP_MOVED_OFF ,跳过

		{
			...
		}
		/* Used by pre-9.0 binary upgrades */
		else if (tuple->t_infomask & HEAP_MOVED_IN) //跳过
		{
			...
		}
		else if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetRawXmin(tuple)))  //插入事务是否为当前事务,不是,跳过
		{
			...
		}
		else if (XidInMVCCSnapshot(HeapTupleHeaderGetRawXmin(tuple), snapshot)) //插入事务是否在快照中(未提交的事务),成立,返回false
			return false;		
		....
}
然后我们再执行第3步,在session A中执行select,第一条记录判断和之前相同,不再赘述,第二条记录判断如下:
bool
HeapTupleSatisfiesMVCC(HeapTuple htup, Snapshot snapshot,
					   Buffer buffer)
{
	HeapTupleHeader tuple = htup->t_data;
	...
	if (!HeapTupleHeaderXminCommitted(tuple))  //进入,插入事务未提交
	{
		if (HeapTupleHeaderXminInvalid(tuple))   //非invalid,跳过
			return false;

		/* Used by pre-9.0 binary upgrades */
		if (tuple->t_infomask & HEAP_MOVED_OFF)   //非HEAP_MOVED_OFF ,跳过

		{
			...
		}
		/* Used by pre-9.0 binary upgrades */
		else if (tuple->t_infomask & HEAP_MOVED_IN) //跳过
		{
			...
		}
		else if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetRawXmin(tuple)))//插入事务是否为当前事务,是的,进入
		{
			if (HeapTupleHeaderGetCmin(tuple) >= snapshot->curcid)
				return false; /* inserted after scan started */
			if (tuple->t_infomask & HEAP_XMAX_INVALID)//insert和select在同一个事务中,而没有进行过delete操作,那是可见的,返回true,能看到两条记录
				return true;
		}
.....
}

接下来commit,再运行第4步,从B 会话中select,显然会有两条记录,对于第一条相同不再分析,那么此时第二条是怎么样的流程呢?

bool
HeapTupleSatisfiesMVCC(HeapTuple htup, Snapshot snapshot,
					   Buffer buffer)
{
	HeapTupleHeader tuple = htup->t_data;

	if (!HeapTupleHeaderXminCommitted(tuple)) //进入,虽然插入事务已经提交,原因见下面
	{
		if (HeapTupleHeaderXminInvalid(tuple))
			return false;

		/* Used by pre-9.0 binary upgrades */
		if (tuple->t_infomask & HEAP_MOVED_OFF) //不成立
		{
			...
		}
		/* Used by pre-9.0 binary upgrades */
		else if (tuple->t_infomask & HEAP_MOVED_IN) //不成立
		{
			...
		}
		else if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetRawXmin(tuple))) //不成立
		{
			...
		}
		else if (XidInMVCCSnapshot(HeapTupleHeaderGetRawXmin(tuple), snapshot))  //不成立
			return false;
		else if (TransactionIdDidCommit(HeapTupleHeaderGetRawXmin(tuple)))  //成立,检查插入事务是否已经提交,如果已经提交,则在tuple上把状态修改成提交状态HEAP_XMIN_COMMITTED,也就是说,提交时并不马上更新状态,等下次用到时再更新,这个操作只要做一次,如果再select,会因为这个状态已经置成了commited而跳过这些逻辑。

			SetHintBits(tuple, buffer, HEAP_XMIN_COMMITTED,
						HeapTupleHeaderGetRawXmin(tuple));
		else
		{
			/* it must have aborted or crashed */
			SetHintBits(tuple, buffer, HEAP_XMIN_INVALID,
						InvalidTransactionId);
			return false;
		}
	}
	else
	{
		/* xmin is committed, but maybe not according to our snapshot */
		if (!HeapTupleHeaderXminFrozen(tuple) &&
			XidInMVCCSnapshot(HeapTupleHeaderGetRawXmin(tuple), snapshot))
			return false;		/* treat as still in progress */
	}

	/* by here, the inserting transaction has committed */

	if (tuple->t_infomask & HEAP_XMAX_INVALID)	//同样在这里返回true
		return true;
...
}
这几个语句只是一个简单示例,抛砖引玉,有兴趣者可深入去研究内部逻辑。

下面补一个元组结构图,更方便大家理解xmax,xmin,以及元组状态。





【0116】PostgreSQL/MVCC 几乎在所有情况下,PostgreSQL 数据库都必须支持许多想要同时添加或更改数据的客户端。这使得有必要保护并发运行的请求,最好不要阻塞它们。 阅读详情

相关推荐

【0000】PostgreSQL V17.4 内核源码剖析专栏(2017 ~ 2025.11.28 更新)

本专栏将会持续更新,直到将PostgreSQL V13.2源码涉及的所有原理、技术剖析完成为止。每一篇文章都是经过多次的源码阅读 + 调试,得以验证之后才梳理成文章形式。最终该专栏的文章数量应该在一万篇或以下,这也是文章序号从【0000】开始的缘故。通过本专栏的学习,能够让你掌握PostgreSQL数据库中的每个技术背后,底层的实现原理。

Postgres 数据库内核开发工程师 1万+

PostgreSQL 源码解读(117)- MVCC#2(获取快照#2)

本节介绍了PostgreSQL获取事务快照的实现逻辑,重点解析了GetTransactionSnapshot->GetSnapshotD...

1094

深入理解PostgreSQL的MVCC并发处理方式

Postgre数据库的很大的卖点之一就是它处理并发的方式。我们的期望很简单:读永远不阻塞写,反之亦然。Postgres通过一个叫做 多版本并发控制(MVCC) 的机制做到了这一点。这个技术并不是Postgres所特有的:还有好几种数据库都实现了不同形式的MVCC,包括 Oracle、Berkeley DB、CouchDB 等等 。当你使用PostgreSQL来设计高并发的应用时,理解它的MVCC是怎么实现的很重要。它事实上是复杂问题的一种非常优雅和简单的解法。 MVCC如何工作 在Postgres中,每一个事务都会得到一个被称作为 XID 的事务ID。这里说的事务不仅仅是被 BEGIN – C

postgresql源码学习(十九)—— MVCC④-可见性判断 HeapTupleSatisfiesMVCC函数

回顾一下前面提到的SNAPSHOT_MVCC类型快照的可见性判断条件:

Hehuyi_In的博客 2281

步进电机选型避雷手册:为什么你的42HS电机总丢步?从相数、电流到散热全面拆解

本文深入剖析了42HS步进电机在高速或重载下易出现丢步问题的根本原因。文章指出,选型时不应仅关注静态保持转矩,而需重点分析动态矩频曲线、合理匹配驱动器电流与细分数、进行准确的机械传动惯量计算,并有效管理系统共振与散热。通过全面拆解这些关键因素,为工程师提供了实用的选型避雷指南与系统优化方案。

weixin_29275257的博客 97

【Python爬虫】股票信息定向爬取

【Python爬虫】股票信息定向爬取:通过requests-bs4-re技术路线爬虫获取上交所和深交所所有股票的名称和交易信息

qq_39321802的博客 1506

PostgreSQL技术内幕11:PostgreSQL事务原理解析-MVCC

本文主要介绍在事务模块中MVCC(多版本并发控制)常见的实现方式,优缺点以及PG事务模块中MVCC(多版本并发控制)的实现。

qq_40529346的博客 1551

STM32F407串口DMA收发实战:标准库配置与环形缓冲区实现

DMA(直接存储器访问)是嵌入式系统中提升数据传输效率的核心技术,它允许外设与内存直接交换数据而无需CPU干预。其工作原理是通过专用硬件控制器接管数据搬运任务,CPU仅需初始化传输参数即可处理其他事务,从而显著降低系统负载。这项技术的核心价值在于释放CPU算力,实现高吞吐、低延迟的实时通信,尤其适用于数据采集、工业控制和通信网关等场景。在STM32F407等ARM Cortex-M4芯片中,串口结合DMA可实现稳定的高速数据流处理。本文以STM32F407标准库为基础,深入解析USART1的DMA发送与接收

weixin_29169899的博客 323

PostgreSQL中的MVCC机制

MVCC,Multi-Version Concurrency Control,多版本并发控制。 一句话讲,MVCC就是用同一份数据临时保留多版本的方式,实现并发控制。它可以避免读写事务之间的互相阻塞,相比通常的封锁技术可极大的提高业务的并发性能。 为何需要MVCC 如果有人从数据库中读数据的同时,有另外的人写入数据,有可能读数据的人会看到『半写』或者不一致的数据。有很多种方法来解决这个问题,叫做并...

hmxz2nn的博客 8923

大开眼界的十大开源人工智能项目

这是一个强大的开源工具,能让你在不同框架之间自由切换,无需重写代码。它是一个开源工具,能用简单的SQL语言同时处理数据和AI模型,让一切变得有序而高效。Rasa是我开发智能聊天机器人时的首选,它让你轻松掌控机器人对话的每个细节。我经常用它快速验证模型在不同框架下的表现,省去了大量烦躁的调试过程。最近发现的Vapi是一个以API方式提供的语音AI工具,开发者友好程度超乎想象。KNIME是一个以拖拽方式构建数据分析流程的开源工具,仿佛是数据界的乐高积木。它像个忠诚的守门员,确保你的模型始终健康运行。

wjianwei666的专栏 1108

QT快速配置MSVC2017编译环境(3分钟极简指南)

本文提供了一份3分钟极简指南,帮助开发者快速配置QT的MSVC2017编译环境。通过断网安装、精准勾选组件和配置QT Creator编译器路径等步骤,大幅提升QT开发效率。MSVC2017作为Windows平台高性能C++编译器,特别适合处理大型QT项目,编译速度优势明显。

weixin_30399821的博客 505

深入理解 PostgreSQL 中的 MVCC(多版本并发控制)机制

简要介绍MVCC(多版本并发控制)概念和其在数据库中的重要性。提出写作目的,即深入理解PostgreSQL中的MVCC机制,并解释读者可以从本文中学到什么。MVCC,即多版本并发控制,是一种用于处理数据库中并发操作的机制。在传统的并发控制方式中,常见的做法是通过锁定资源来确保在某一时刻只有一个事务可以修改或读取数据,以防止数据不一致或冲突。然而,传统的锁定机制可能会导致性能瓶颈和并发性下降,尤其在高并发访问的情况下。MVCC通过引入多个数据版本来解决传统锁定机制的一些局限性。

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:优快云WF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 3948

VMwareWorkstation安装UOS系统(1070版本)教程

UOS系统是一款国产信创操作系统。目前市面上主流的系统版本是1070,下面我们用虚拟机来安装一下这款系统。

欲买桂花同载酒的博客 4303

Database-浅谈Postgresql与Mysql的MVCC实现机制

Database-Postgresql与Mysql的MVCC多版本并发控制原理MVCC介绍Postgresql中MVCC的实现 MVCC介绍 在早期的数据库理论中,一行元组上有两种锁,一种读锁,一种写锁,读会阻塞写,写也会阻塞读,这对于一个并发繁忙的系统来说代价是异常高昂的。 对于传统数据库来说,为了维护数据的一致性和完整性,避免一个事务看到其它并发事务更新而导致看到不一致的数据,通常采用的是LO...

adson1987的博客 6238

搞定ESD(九):静电放电之PCB设计

不同信号参考地平面应尽量保持完整,减小静电电流流过参考地平面时造成的电位差,防止电位差导致的信号传输电平错误.主芯片GPIO信号布线应保持最短化,减小与参考地平面之间的电场耦合,同时也防止因信号环路面积较大耦合静电放电噪声干扰。外部端子接地引脚顶层采用分地设计,最好是直接过孔到完整参考地平面接地,避免与顶层信号包地、其它包地相连,防止顶层串扰耦合到其它信号,造成ESD问题。

记得诚 1954

机加工机器人系列编程:Fanuc M-710iC_(2).FanucM-710iC机器人的硬件配置

Fanuc M-710iC 机器人是一种广泛应用在汽车零部件制造行业中的工业机器人。它的本体结构设计紧凑、稳定,适用于多种加工任务。了解机器人的本体结构是进行编程和维护的基础。

zhubeibei168的博客 994

PostgreSQL 事务回滚与冻结机制

模块核心逻辑目标事务回滚分层清理内存、锁、缓冲区、统计保证异常事务不破坏系统一致性MVCC 可见性基于事务ID比较快照保证事务隔离与正确可见性冻结策略两阶段年龄驱动冻结xmin/xmax防止事务ID回卷和长期元组不可见回卷防护检查nextXid接近阈值触发 vacuum避免事务ID耗尽协同效果:回滚 + MVCC + 冻结 + 回卷防护机制确保 PostgreSQL 在高并发环境下维持ACID特性和数据一致性。我可以帮你画一张。

喝醉酒的小白 855

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

postgresql源码学习整理

最近在学习postgresql源码,观看cuichao1900的转载文章,写的非常好,但是顺序是乱的,所以在这里整理一下

vivian_hus的博客 2574

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

PostgreSQL数据库架构与源码分析

PostgreSQL是一个架构清晰、模块化程度高的数据库系统。可靠性: MVCC+WAL保证ACID特性扩展性: 丰富的扩展接口和类型系统高性能: 先进的查询优化器和执行引擎可维护性: 清晰的代码结构和注释深入理解PostgreSQL的架构和源码,对于数据库调优、故障排查和扩展开发都有重要意义。推荐阅读PostgreSQL官方文档: https://www.postgresql.org/docs/源码浏览: https://doxygen.postgresql.org/

AI技术改变世界 1442

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

各数据库MVCC机制

文章目录一、MySQL二、Oracle三、SQL Server四、PostgreSQL五、MongoDB   MVCC即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。MVCC的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。 一、MySQL   InnoDB是一个多版本的存储引擎:它保存有关已更改行的旧版本的信息以支持事务性功能,如并发和回滚。这些信息存储在表空间中的

雪辉博客 1156

PostgreSQL MVCC快照机制浅析

快照隔离是数据库实现并发控制的一种常用技术.本节简单探讨了快照理论模型、PostgreSQL中的工程实践以及由此推广到Postgres-XL的...

1057

postgresql源码学习(49)—— MVCC⑤-cmin与cmax 同事务内的可见性判断

cmin与cmax 同事务内的可见性判断

Hehuyi_In的博客 1870

PostgreSQL笔记26:MVCC多版本并发控制机制深度解析

本文深入解析了PostgreSQL的MVCC机制和事务隔离实现。主要内容包括:元组内部结构(HeapTupleHeader)的关键字段如t_xmin/t_xmax等;数据操作(INSERT/DELETE/UPDATE)在MVCC下的具体行为;提交日志(CLOG)的作用;快照(Snapshot)的生成与可见性判断规则;四种隔离级别的实现差异;以及通过pageinspect插件观察元组状态和VACUUM清理死元组的操作。文章还提供了Node.js示例代码,展示如何通过pg库观察MVCC行为。这些机制共同构成了P

Wang的专栏 641

pg_repack源码解析:深入理解PostgreSQL在线重组机制

PostgreSQL作为强大的开源数据库,在高并发场景下容易出现表碎片化问题,影响查询性能。**pg_repack**作为PostgreSQL生态中重要的在线表重组工具,能够在最小化锁冲突的前提下完成表结构优化。本文将从源码角度剖析其核心实现机制,帮助开发者理解如何在生产环境中安全高效地使用这一工具。 ## 核心功能模块架构 pg_repack采用客户端-服务端架构设计,主要由两大功能模块构成

gitblog_01018的博客 786

PostgreSQL 存储原理全解:从页面结构到 MVCC 的深度解析

对于 DBA、后端开发者以及数据库内核爱好者来说,PostgreSQL 的存储层是整个系统的基石。不论是进行性能调优、容量规划、故障排查,还是设计高可用的流复制架构,对数据如何在磁盘上布局、多版本如何创建与清理、WAL 如何保障一致性的透彻理解,都会直接决定你解决问题的速度和方案的可靠性。PostgreSQL 官方文档的“Database Physical Storage”章节以及源代码中和的注释为本文提供了最权威的依据。

m0_73669661的博客 946

postgresql源码学习(十七)—— MVCC②-快照与隔离级别简介

一、 快照简介 快照是记录数据库当前瞬时状态的一个数据结构。pg的快照主要保存:当前所有活跃事务的最小、最大事务ID、当前活跃事务列表、commandID等。 快照可以分为多种类型,每种快照类型都对应了一种判断元组可见性的方法。 二、 快照结构体 1. 结构体定义 typedef struct SnapshotData *Snapshot; typedef struct SnapshotData { SnapshotType snapshot_type;...

Hehuyi_In的博客 3940
上一篇: postgresql中如何新增加一个SysCache
下一篇: telnet 测试MySQL时通时不通问题分析
postgres20
博客等级 码龄10年 100粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值