事务简介
数据库事务是指作为单个逻辑工作单元的一系列操作的集合。一个典型的事务由应用程序中的一组操作序列组成,对于 DM 数据库来说,第一次执行 SQL 语句时,隐式地启动一个事务,以 COMMIT 或 ROLLBACK 语句/方法显式地结束事务。另外,在执行 DDL 前,DM 数据库会自动把前面的操作进行提交,DDL 前面的操作作为一个完整的事务结束,DDL 语句本身所属事务则根据“DDL_AUTO_COMMIT”配置参数决定是否隐式地提交
事务特性
原子性
事务包含的一组更新操作是原子不可分的,也就是说这些更新操作是一个整体,对数据库而言全做或者全不做,不能部分地完成。系统对磁盘上的任何实际数据的修改之前都会将修改操作本身的信息记录到磁盘上。当发生崩溃时,系统能根据这些操作记录当时该事务处于何种状态,以此确定是撤销该事务所做出的所有修改操作,还是将修改的操作重新执行。
一致性
一致性是指表示客观世界同一事务状态的数据,不管出现在何时何处都是一致的、正确的、完整的。换句话说,数据一致性是任何点上保证数据以及内部数据结构的完整性,如 B 树索引的正确性。
隔离性
事务是隔离的,意味着每个事务的执行效果与系统中只有该事务的执行效果一样,也就是说,某个并发事务所做的修改必须与任何其他的并发事务所做的修改相互隔离。这样,只有当某个值被一个事务修改完并提交后才会影响到另一个事务。事务只会识别另一并发事务修改之前或者修改完成之后的数据,不会识别处于这中间状态的数据。事务的隔离行为依赖于指定的隔离级别
持久性
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。即一旦一个事务提交,DBMS 保证它对数据库中数据的改变应该是永久性的。如果 DM 数据库或者操作系统出现故障,那么在 DM 数据库重启的时候,数据库会自动恢复。如果某个数据驱动器出现故障,并且数据丢失或者被损坏,可以通过备份和联机重做日志来恢复数据库。
提交事务
提交事务就是提交事务对数据库所做的修改,将从事务开始的所有更新保存到数据库中,任何更改的记录都被写入日志文件并最终写入到数据文件,同时提交事务还会释放由事务占用的资源,如锁。如果提交时数据还没有写入到数据文件,DM 数据库后台线程会在适当时机(如检查点、缓冲区满)将它们写入。在提交事务之前,数据库已经完成了以下动作:
隐式提交
在手动提交模式下,当遇到 DDL 语句时,DM 数据库会在执行 DDL 语句之前自动提交前面的事务,然后开始一个新的事务执行 DDL 语句,这种事务提交被称为隐式提交。但在 DMDPC 环境下,节点会将 DDL 语句转发给 MP 进行解析执行,在转发之前便会自动提交前面的事务,因此在 DMDPC 环境下,DDL 语句解析失败与否不会影响前面事务的提交
在另一个会话中执行select * from test_trc;此时查询不到数据,证明insert语句还未提交
执行错误的DDL语句后再进行查询,此时仍未能查询到数据
执行正常的DDL语句后,再进行查询,此时其他会话可以查询到数据,证明insert语句已提交
回滚事务
回滚事务是撤消该事务所做的任何更改。回滚有两种形式:DM 数据库自动回滚,或者通过程序/ROLLBACK 命令手动回滚。除此之外,DM 还支持回滚到保存点和语句级回滚。
在事务回滚过程中如果访问到损坏的数据页,则会将当前事务信息登记到系统表 SYSCRASHTRXS 中,SYSCRASHTRXS 中的事务会被当做活动事务,保证其他事务不会访问到故障事务修改后的记录。
事务回滚过程可能失败,比如遇到存储空间不足、对象已经被修改、表空间被删除等,事务回滚失败,不再继续回滚。此时会将事务状态调整为回滚挂起,事务保留在系统中,事务持有的锁等资源也保留,可能会导致后续对回滚挂起事务中涉及的表的修改操作因表被封锁导致失败报错锁超时,通过 V$TRX 中 status 字段可以查询到此类事务。系统定时每 5 分钟发起任务尝试对这些回滚挂起事务进行自动回滚操作,也可以通过 SUSPEND_TRX_PROCESS(trxid)手动继续回滚,回滚成功后即可恢复正常操作
自动回滚
若事务运行期间出现连接断开,DM 数据库都会自动回滚该连接所产生的事务。回滚会撤消事务执行的所有数据库更改,并释放此事务使用的所有数据库资源。DM 数据库在恢复时也会使用自动回滚。例如在运行事务时服务器突然断电,接着系统重新启动,DM 数据库就会在重启时执行自动恢复。自动恢复要从事务重做日志中读取信息以重新执行没有写入磁盘的已提交事务,或者回滚断电时还没有来得及提交的事务
手动回滚
一般来说,在实际应用中,当某条 SQL 语句执行失败时,用户会主动使用 ROLLBACK 语句或者编程接口提供的回滚函数来回滚整个事务,避免不合逻辑的事务污染数据库,导致数据不一致。如果发生错误后确实只用回滚事务中的一部分,则需要用到回滚到保存点的功能。
回滚到保存点
除了回滚整个事务之外,DM 数据库的用户还可以部分回滚未提交事务,即从事务的最末端回滚到事务中任意一个被称为保存点的标记处。用户在事务内可以声明多个被称为保存点的标记,将一个大事务划分为几个较小的片断。之后用户在对事务进行回滚操作时,就可以选择从当前执行位置回滚到事务内的任意一个保存点。例如用户可以在一系列复杂的更新操作之间插入保存点,如果执行过程中一个语句出现错误,用户可以回滚到错误之前的某个保存点,而不必重新提交所有的语句。当事务被回滚到某个保存点后,DM 数据库将释放被回滚语句中使用的锁。其他等待“被锁资源”的事务就可以继续执行,需要更新“被锁数据行”的事务也可以继续执行。
将事务回滚到某个保存点的过程如下:
文章
阅读量
获赞
