本文主要介绍PostgreSQL中有哪些事务,非常详细,有一定的参考价值。感兴趣的朋友一定要看完!
一、什么是事务?
一个事务可以看作是一个有序的操作集合,应该作为一个整体来对待,即只有当集合中的所有操作都成功时,该事务才被认为是成功的,否则,即使只有一个操作失败,该事务也会被认为是不成功的。如果所有操作都成功,那么事务将被提交,然后它的修改可以被所有其他数据库进程使用。如果操作失败,事务将回滚,事务中所有已完成的操作所做的所有修改都将被撤销。在提交事务之前,事务期间所做的修改仅适用于拥有该事务的流程。这样做的原因是为了防止其他线程在使用事务修改的数据后回滚事务,从而导致数据完整性错误。
功能是企业数据库的关键,因为许多业务流程是由多个步骤组成的。我们以网购为例来说明一下。在结账时,客户的购物车将与现有库存进行比较,以确保它有库存。接下来,客户必须提供收费和送货信息。这时候就要检查相应的信用卡是否可用,并从中扣钱。然后,需要从产品库存清单中扣除相应的数量,如果库存不足,应该向采购部门发出通知。在这些步骤中,只要一个步骤出现错误,所有更改都不应该生效。如果客户的信用卡在没有库存的时候还被扣,那么客户会很生气,问题会很严重。同样的,作为一个网商,当信用卡失效的时候,你肯定不希望从库存清单中扣除客户选择的商品数量,或者发出相应的购买通知。
我们在这里讨论的必须满足四个主要要求:
原子性:公司的所有步骤都必须成功;否则,将不会提交任何步骤。
l:一致性:公司的所有步骤都必须成功;否则,所有数据都将恢复到事务开始之前的状态。
l隔离:在事务完成之前,所有执行的步骤都必须与系统隔离。
l持久性:所有提交的数据必须由系统妥善保管,在系统出现故障时,数据可以恢复到有效状态。
PostgreSQL的事务支持功能完全遵循上述四个基本原则(有时简称ACID),从而有效地保证了数据库的完整性。
二、PostgreSQL的事务隔离
PostgreSQL的事务支持是通过所谓的多版本并发控制或MVCC方法来实现的,也就是说,每当处理一个事务时,它都会看到自己的数据库快照,而不是底层数据的实际状态。这使得任何给定的事务都不可能看到其他已启动但未提交的事务对数据进行的部分修改。这个原则叫做事务隔离。
SQL标准指定了三个属性来确定事务处于四个隔离级别中的哪一个。这些属性如下:
l脏读:一个事务读取另一个未提交的并行事务写入的数据。
l不可重复读取:当一个事务重新读取之前读取的数据时,发现该数据已经被另一个提交的事务修改。
l错觉阅读:当一个事务重新执行一个查询时,它会返回一组满足查询条件的行,并发现这些行由于最近提交的其他事务而发生了变化。
这三种情况决定了事务的隔离级别,所有四个级别都显示在表1中。
表1 SQL标准事务隔离级别
#FormatImgID_0#
PostgreSQL允许您请求四种可能的事务隔离级别中的任何一种。但是在内部,实际上只有两个隔离级别可用,分别对应于读提交和可序列化。如果选择读未提交级别,实际使用读提交级别,选择可重复读级别,实际使用可序列化级别,因此实际隔离级别可能比选择的更严格。虽然这似乎与我们的直觉相反,但SQL标准确实允许这一点,因为四个隔离级别只定义了哪个现象不能发生,但没有定义哪个现象必须发生,所以除了不允许的事务特性之外,所有特性都是允许的。例如,如果你要求可重复阅读模式,那么标准只要求不允许你脏读或重读,但不要求你允许不真实阅读。因此,可序列化的事务模式满足可重复读取模式的要求,即使它与定义不完全匹配。因此,您应该确切地知道,当您请求读取未提交模式时,您实际得到的是读取已提交模式;当您要求可重复读取时,您实际得到的是可序列化模式。您还应该意识到,默认情况下,如果您不请求特定的隔离级别,您将获得读取提交的隔离级别。
让我们看看读提交和可序列化之间的主要区别。在读取提交模式下,SELECT查询只能看到查询开始前提交的数据,但在执行查询时永远看不到未提交的数据或其他并行事务提交的变化。但是,SELECT确实会在同一事务中看到以前更新的结果,即使它们尚未提交。事实上,当查询开始运行时,SELECT查询会看到数据库的快照。请注意,两个相邻的SELECT命令可能会看到不同的数据,即使它们在同一个事务中,因为在执行第一个SELECT时,其他事务将被提交。当事务处于可序列化级别时,SELECT查询只能看到事务开始前提交的数据,但永远看不到事务执行期间其他并行事务提交的未提交数据或修改。但是,SELECT确实会看到同一事务中以前更新的效果,即使该事务尚未提交。这种行为不同于阅读提交的级别,它的SE
LECT 看到的是该事务开始时的快照,而不是该事务内部当前查询开始时的快照。这样,一个事务内部后面的SELECT命令总是看到同样的数据。这意味着,读已提交模式下一个事务内部后面的SELECT命令可以看到不同的数据,但是在可串行化模式下却总是看到同样的数据。
对于以上区别,请读者一定弄清楚。虽然刚看上去有些复杂,但是只要抓住两个要点,理解起来还是很容易的:首先,PostgreSQL运行事务的并发运行,也就是说一个事务执行的时候,并不妨碍另一事务对相同数据操作。其次,一定注意快照的概念,事务提交前操作的是数据快照而非数据库本身,同时注意不同隔离级别使用的是何时的快照——事务开始之前的快照,还是事务内部操作开始之前的快照?我想只要抓住了以上要点,我们就能很好的把握各种隔离级别之间的区别了。
上面介绍了事务的基本概念,接下来我们开始演示如何在PostgreSQL客户端中使用事务。
三、创建示例表
下面,我们通过一个具体的在线交易应用为例来阐述上面介绍的事务概念。为此,我们需要先给这个示例程序在名为company的数据库中创建两个表:participant和trunk。同时,我们还会介绍各个表的用途和结构。建好表后,我们还需为它们填入一些样本数据,具体如下所示。
我们首先创建Participant表,这个表用来存放参与物品交换者的信息,包括他们的姓名、电子邮件地址和可用现金:
1 CREATE TABLE participant (
2 participantid SERIAL,
3 name TEXT NOT NULL,
4 email TEXT NOT NULL,
5 cash NUMERIC(5,2) NOT NULL,
6 PRIMARY KEY (participantid)
7 );
8 CREATE TABLE<span
以上是“PostgreSQL中什么是事务”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/118541.html