导读:事务的概念
百度百科对事务的介绍如下: 事务(Transaction),一般是指要做的或所做的事情。 在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。 事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。 事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
复制
如何简单的理解事务是什么呢?
以银行的业务举例:银行经常办理的业务中有一个转账的业务。假设小明需要将1000万元的转账给小刚,因为涉及金额巨大,所以到银行柜台办理。银行的工作人员根据小明的要求,对相关内容核实后,进行转账操作,而这个转账的过程就是一个事务。事务需要满足是个特性,即ACID。那什么是ACID呢?A表示原子性(atomicity),即转账这个过程要么成功,要么失败,不能说成功一半;C表示一致性(consistency),即小明的账户会减少1000万元,而小刚的账户会增加1000万元,他们看到的金融应该是一致的;I表示隔离性(isolation),假设小明在给小刚转账的同时,张三也在转账给小刚,虽然小明和张三都在给小刚转账,但是小明和张三的操作并不会对彼此产生影响,是相互独立的;D表示持久性(durability),当小明把1000万元转给小刚以后,这个结果就应该被数据库保存起来。
文档内容
有了前面的铺垫,再来看opengauss关于事务管理的说明:
-
管理事务
事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。openGauss数据库支持的事务控制命令有启动、设置、提交、回滚事务。openGauss数据库支持的事务隔离级别有读已提交和可重复读。 -
事务控制
以下是数据库支持的事务命令:-
启动事务
用户可以使用START TRANSACTION和BEGIN语法启动事务。
-
设置事务
用户可以使用SET TRANSACTION或者SET LOCAL TRANSACTION语法设置事务特性,详细操作请参考SET TRANSACTION。
-
提交事务
用户可以使用COMMIT或者END可完成提交事务的功能,即提交事务的所有操作,详细操作请参考COMMIT | END。
-
回滚事务
回滚是在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销,详细操作请参考ROLLBACK。
-
事务隔离级别
事务隔离级别,它决定多个事务并发操作同一个对象时的处理方式。
-
-
说明:
在事务中第一个数据修改语句(SELECT, INSERT,DELETE,UPDATE,FETCH,COPY)执行之后,事务隔离级别就不能再次设置。 -
READ COMMITTED:读已提交隔离级别,事务只能读到已提交的数据而不会读到未提交的数据,这是缺省值。
实际上,SELECT查询会查看到在查询开始运行的瞬间该数据库的一个快照。不过,SELECT能查看到其自身所在事务中先前更新的执行结果。即使先前更新尚未提交。请注意,在同一个事务里两个相邻的SELECT命令可能会查看到不同的快照,因为其它事务会在第一个SELECT执行期间提交。-
因为在读已提交模式里,每个新的命令都是从一个新的快照开始的,而这个快照包含所有到该时刻为止已提交的事务,因此同一事务中后面的命令将看到任何已提交的其它事务的效果。这里关心的问题是在单个命令里是否看到数据库里绝对一致的视图。
读已提交模式提供的部分事务隔离对于许多应用而言是足够的,并且这个模式速度快,使用简单。不过,对于做复杂查询和更新的应用,可能需要保证数据库有比读已提交模式更加严格的一致性视图。
-
REPEATABLE READ:事务可重复读隔离级别,事务只能读到事务开始之前已提交的数据,不能读到未提交的数据以及事务执行期间其它并发事务提交的修改(但是,查询能查看到自身所在事务中先前更新的执行结果,即使先前更新尚未提交)。这个级别和读已提交是不一样的,因为可重复读事务中的查询看到的是事务开始时的快照,不是该事务内部当前查询开始时的快照,就是说,单个事务内部的select命令总是查看到同样的数据,查看不到自身事务开始之后其他并发事务修改后提交的数据。使用该级别的应用必须准备好重试事务,因为可能会发生串行化失败