1001.pg概述-数据的事务

事务是所有数据库系统的基础概念。

事务最重要的一点是它将多个步骤捆绑成了一个单一的、要么全完成要么全不完成的操作。

步骤之间的中间状态对于其他并发事务是不可见的,并且如果有某些错误发生导致事务不能完成,则其中任何一个步骤都不会对数据库造成影响。

例如,考虑一个保存着多个客户账户余额和支行总存款额的银行数据库。

【原子性】一个事务被称为是原子的:从其他事务的角度来看,它要么整个发生要么完全不发生。

【持久性】一个事务型数据库保证一个事务在被报告为完成之前它所做的所有更新都被记录在持久存储

【独立性】当多个事务并发运行时,每一个都不能看到其他事务未完成的修改。

 

在事务执行中我们并不想提交(或许是我们注意到Alice的余额不足),我们可以发出ROLLBACK命令而不是COMMIT命令,这样所有目前的更新将会被取消。

 

PostgreSQL实际上将每一个SQL语句都作为一个事务来执行。

如果我们没有发出BEGIN命令,则每个独立的语句都会被加上一个隐式的BEGIN以及(如果成功)COMMIT来包围它。

一组被BEGIN和COMMIT包围的语句也被称为一个事务块。

 

也可以利用保存点来以更细的粒度来控制一个事务中的语句。

保存点允许我们有选择性地放弃事务的一部分而提交剩下的部分。

我们可以在必要时利用ROLLBACK TO回滚到该保存点。该事务中位于保存点和回滚点之间的数据库修改都会被放弃,但是早于该保存点的修改则会被保存

 

在回滚到保存点之后,它的定义依然存在,因此我们可以多次回滚到它。

反过来,如果确定不再需要回滚到特定的保存点,它可以被释放以便系统释放一些资源。记住不管是释放保存点还是回滚到保存点都会释放定义在该保存点之后的所有其他保存点。

 

所有这些都发生在一个事务块内,因此这些对于其他数据库会话都不可见。当提交整个事务块时,被提交的动作将作为一个单元变得对其他会话可见,而被回滚的动作则永远不会变得可见。(回滚其他会话不可见,提交其他会话可见)

posted @ 2020-12-21 00:58  bufuzhou  阅读(123)  评论(0编辑  收藏  举报