API开发工程师-API数据处理与存储-PostgreSQL_事务与锁.docx

API开发工程师-API数据处理与存储-PostgreSQL_事务与锁.docx

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

PAGE1

PAGE1

事务基础

1事务的概念与特性

在数据库操作中,事务(Transaction)是一个不可分割的工作单位。在PostgreSQL中,事务确保了数据操作的完整性和一致性,即使在系统故障或操作中断的情况下,也能保证数据的正确性。事务具有以下四个特性,通常被称为ACID特性:

原子性(Atomicity):事务中的所有操作要么全部完成,要么一个也不完成。如果事务在完成前被中断,所有已执行的操作将被回滚,数据库将恢复到事务开始前的状态。

一致性(Consistency):事务将数据库从一个一致状态转换到另一个一致状态。事务开始前和结束后,数据库都必须处于一致状态。

隔离性(Isolation):并发执行的事务之间不能互相干扰。每个事务都独立于其他事务,如同在单用户环境下执行一样。

持久性(Durability):一旦事务完成,它对数据库的更改是永久的,即使系统发生故障,这些更改也不会丢失。

2事务的开始与结束

在PostgreSQL中,事务可以通过BEGIN和END语句来显式地开始和结束。事务也可以通过COMMIT或ROLLBACK语句来结束,其中COMMIT用于提交事务,ROLLBACK用于回滚事务。

2.1示例代码

假设我们有一个简单的bank表,用于存储银行账户信息,包括account_id和balance字段。我们将通过一个事务来更新两个账户的余额,以模拟转账操作。

--创建bank表

CREATETABLEbank(

account_idSERIALPRIMARYKEY,

balanceNUMERIC(10,2)NOTNULL

);

--插入两个账户

INSERTINTObank(balance)VALUES(1000.00),(500.00);

--开始事务

BEGIN;

--更新账户1的余额

UPDATEbankSETbalance=balance-200.00WHEREaccount_id=1;

--更新账户2的余额

UPDATEbankSETbalance=balance+200.00WHEREaccount_id=2;

--提交事务

COMMIT;

在这个例子中,我们首先创建了一个bank表,并插入了两个账户。然后,我们开始了一个事务,更新了账户1的余额,减少了200元,接着更新了账户2的余额,增加了200元。最后,我们提交了事务,确保了转账操作的完整性和一致性。

如果在事务中发生错误,我们可以使用ROLLBACK来撤销所有更改:

BEGIN;

UPDATEbankSETbalance=balance-300.00WHEREaccount_id=1;

--假设这里发生了一个错误,我们回滚事务

ROLLBACK;

在这个例子中,如果在更新账户1的余额时发生错误,我们可以回滚事务,撤销所有更改,保持数据库的一致性。

3事务的隔离级别

事务的隔离级别定义了事务之间数据的可见性。PostgreSQL支持四种隔离级别:READUNCOMMITTED、READCOMMITTED、REPEATABLEREAD和SERIALIZABLE。默认的隔离级别是READCOMMITTED。

3.1示例代码

假设我们有两个事务,事务A和事务B,它们都在尝试更新同一个账户的余额。我们将使用不同的隔离级别来观察事务之间的数据可见性。

--事务A

BEGIN;

--设置隔离级别为READCOMMITTED

SETTRANSACTIONISOLATIONLEVELREADCOMMITTED;

--查询账户余额

SELECTbalanceFROMbankWHEREaccount_id=1;

--暂停事务A,以便事务B可以执行

SELECTpg_sleep(5);

--更新账户余额

UPDATEbankSETbalance=balance+100.00WHEREaccount_id=1;

--提交事务A

COMMIT;

--事务B

BEGIN;

--设置隔离级别为READUNCOMMITTED

SETTRANSACTIONISOLATIONLEVELREADUNCOMMITTED;

--查询账户余额

SELECTbalanceFROMbankWHEREaccount_id=1;

--更新账户余额

UPDATEbankSETbalance=balance+50.00WHEREaccount_id=1;

--提交事务B

COMM

文档评论(0)

***** + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档