- 1、本文档共17页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
- API开发工程师-API设计与开发-API安全_API安全测试与漏洞扫描.docx
- API开发工程师-API设计与开发-API安全_API安全的未来趋势与新兴技术.docx
- API开发工程师-API设计与开发-API安全_API安全的行业标准与合规性.docx
- API开发工程师-API设计与开发-API安全_API安全风险与威胁模型.docx
- API开发工程师-API设计与开发-API安全_API安全概述与重要性.docx
- API开发工程师-API设计与开发-API安全_API安全最佳实践与框架.docx
- API开发工程师-API设计与开发-API安全_API网关与安全策略实施.docx
- API开发工程师-API设计与开发-API版本控制_API版本控制策略:前缀版本与日期版本.docx
- API开发工程师-API设计与开发-API版本控制_API版本控制的案例分析:成功与失败的经验.docx
- API开发工程师-API设计与开发-API版本控制_API版本控制的概述与重要性.docx
文档评论(0)