
# 管理事务
事务是用户定义的一个数据库操作序列，这些操作要么全做要么全不做，是一个不可分割的工作单位。GaussDB数据库支持的事务控制命令有启动、设置、提交、回滚。GaussDB数据库支持的事务隔离级别有READ COMMITTED、READ UNCOMMITTED、REPEATABLE READ和SERIALIZABLE，不推荐使用READ UNCOMMITTED，SERIALIZABLE等价于REPEATABLE READ。
#### 事务控制
以下是数据库支持的事务命令：
- 启动事务 用户可以使用START TRANSACTION或者BEGIN语法启动事务，详细操作请参考[START TRANSACTION](https://support.huaweicloud.com/distributed-devg-v2-gaussdb/gaussdb-12-0452.html#ZH-CN_TOPIC_0000002222774533)和[BEGIN](https://support.huaweicloud.com/distributed-devg-v2-gaussdb/gaussdb-12-0346.html#ZH-CN_TOPIC_0000002187368720)。
  
- 设置事务 用户可以使用SET TRANSACTION或者SET LOCAL TRANSACTION语法设置事务，详细操作请参考[SET TRANSACTION](https://support.huaweicloud.com/distributed-devg-v2-gaussdb/gaussdb-12-0449.html#ZH-CN_TOPIC_0000002222888933)。
  
- 提交事务 用户可以使用COMMIT或者END可完成提交事务的功能，即提交事务的所有操作，详细操作请参考[COMMIT \| END](https://support.huaweicloud.com/distributed-devg-v2-gaussdb/gaussdb-12-0353.html#ZH-CN_TOPIC_0000002222888829)。
  
- 回滚事务 回滚是在事务运行的过程中发生了某种故障，事务不能继续执行，系统将事务中对数据库的所有已完成的操作全部撤销，详细操作请参考[ROLLBACK](https://support.huaweicloud.com/distributed-devg-v2-gaussdb/gaussdb-12-0439.html#ZH-CN_TOPIC_0000002187528508)。
  
#### 事务隔离级别
事务隔离级别，它决定多个事务并发操作同一个对象时的处理方式。
![](https://support.huaweicloud.com/distributed-devg-v2-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
在事务中第一个数据修改语句（SELECT，INSERT，DELETE，UPDATE，FETCH，COPY）执行之后，事务隔离级别就不能再次设置。
- **READ COMMITTED** ：读已提交隔离级别，事务只能读到已提交的数据而不会读到未提交的数据，这是缺省值。
  实际上，SELECT查询会查看到在查询开始运行的瞬间该数据库的一个快照。不过，SELECT能查看到其自身所在事务中先前修改的执行结果。即使先前修改尚未提交。请注意，在同一个事务里两个相邻的SELECT命令可能会查看到不同的快照，因为其它事务会在第一个SELECT执行期间提交。
  因为在读已提交模式里，每个新的命令都是从一个新的快照开始的，而这个快照包含所有到该时刻为止已提交的事务，因此同一事务中后面的命令将看到任何已提交的其它事务的效果。这里关心的问题是在单个命令里是否看到数据库里完全一致的视图。
  读已提交模式提供的部分事务隔离对于许多应用而言是足够的，并且这个模式速度快，使用简单。不过，对于做复杂查询和更新的应用，可能需要保证数据库有比读已提交模式更加严格的一致性视图。
  
- **READ UNCOMMITTED**：读未提交隔离级别。不推荐使用，可能产生数据不一致现象。在协调节点故障无法恢复时或应急时可考虑使用，越过GTM与CN/DN不一致时的阻塞，但建议写事务不要使用，以免产生数据不一致现象，读事务可应急使用。
- **REPEATABLE READ**：事务可重复读隔离级别，事务只能读到事务开始之前已提交的数据，不能读到未提交的数据以及事务执行期间其它并发事务提交的修改（但是，查询能查看到自身所在事务中先前修改的执行结果，即使先前修改尚未提交）。这个级别和读已提交是不一样的，因为可重复读事务中的查询看到的是事务开始时的快照，不是该事务内部当前查询开始时的快照，就是说，单个事务内部的select命令总是查看到同样的数据，查看不到自身事务开始之后其他并发事务修改后提交的数据。使用该级别的应用必须准备好重试事务，因为可能会发生串行化失败。
- **SERIALIZABLE**：GaussDB目前功能上不支持此隔离级别，设置该隔离级别时，等价于REPEATABLE READ。
 
