
# 事务
GaussDB数据库兼容MySQL的事务，但存在部分差异。本章节介绍GaussDB数据库中事务相关的差异。
#### 事务默认隔离级别
GaussDB数据库默认隔离级别为READ COMMITTED，MySQL默认隔离级别为REPEATABLE-READ。
```
-- 查看当前事务隔离级别。
m_db=# SHOW transaction_isolation;
 transaction_isolation
-----------------------
 read committed
(1 row)
```
#### 子事务
GaussDB数据库中，可使用SAVEPOINT用于在当前事务里建立一个新的保存点（子事务），使用ROLLBACK TO SAVEPOINT回滚到指定保存点（子事务），子事务回滚后父事务可以继续运行，子事务的回滚不影响父事务的事务状态。
MySQL不存在创建保存点（子事务）。
#### 嵌套事务
嵌套事务指在事务块中开启新事务。
GaussDB数据库中，正常事务块中开启新事务会警告存在一个进行中的事务，忽略开启命令；异常事务块中开启新事务将报错，必须在执行ROLLBACK/COMMIT回滚之前的语句后才可以执行。
MySQL中，正常事务块中开启新事务会先把之前事务提交，然后开启新事务；异常事务块中开启新事务会忽略错误，提交之前无错误的语句并开启新事务。
```
-- GaussDB数据库正常事务块中，开启新事务会警告并忽略。
m_db=# DROP TABLE IF EXISTS test_t;
m_db=# CREATE TABLE test_t(a int, b int);
m_db=# BEGIN;
m_db=# INSERT INTO test_t values(1, 2);
m_db=# BEGIN;   -- 会警告there is already a transaction in progress。
m_db=# SELECT * FROM test_t ORDER BY 1;
m_db=# COMMIT; 
-- GaussDB数据库异常事务块中，开启新事务会报错，必须ROLLBACK/COMMIT之后才可以执行。
m_db=# BEGIN;
m_db=# ERROR sql; -- 错误语句。
m_db=# BEGIN; -- 报错。
m_db=# COMMIT; -- ROLLBACK/COMMIT之后才可以执行。
```
#### 隐式提交的语句
GaussDB数据库使用GaussDB存储，继承GaussDB事务机制，事务中执行DDL、DCL不会自动提交。
MySQL在DDL、DCL、管理类语句，锁相关语句会自动提交。
```
-- GaussDB数据库创建表和设置GUC参数可以回滚操作。
m_db=# DROP TABLE IF EXISTS test_table_rollback;
m_db=# BEGIN;
m_db=# CREATE TABLE test_table_rollback(a int, b int);
m_db=# \d test_table_rollback;
m_db=# ROLLBACK;
m_db=# \d test_table_rollback; -- 不存在该表。
Did not find any relation named "test_table_rollback".
```
#### SET TRANSACTION差异
GaussDB数据库中，SET TRANSACTION同时设置多次隔离级别/事务访问模式时，只有最后一个会生效；多个事务特性支持使用空格和逗号分隔。
MySQL中SET TRANSACTION不允许设置多次隔离级别/事务访问模式；多个事务特性只支持使用逗号分隔。
表1SET TRANSACTION差异 
| 语法                      | 功能                               | 差异                                                                                                                                                                                      |
|:---|:---|:---|
| SET TRANSACTION         | 设置事务特性。                          | GaussDB数据库中，不开启m_format_dev_version='s2'参数时，SET TRANSACTION在会话级别生效，功能与SET SESSION TRANSACTION一致；开启m_format_dev_version='s2'参数时，SET TRANSACTION是设置下一个事务特性；MySQL中SET TRANSACTION在下一个事务生效。 |
| SET SESSION TRANSACTION | 设置会话级事务特性。                       | -                                                                                                                                                                                       |
| SET GLOBAL TRANSACTION  | 设置全局会话级事务特性，该特性适用于后续会话，对当前会话无影响。 | GaussDB数据库中，GLOBAL是全局会话级别生效，只针对当前数据库实例，其它数据库不影响。 MySQL中，会使所有数据库生效。                                                                      |
   
```
-- SET TRANSACTION会话级生效。
m_db=# SET TRANSACTION ISOLATION LEVEL READ COMMITTED READ WRITE;
m_db=# SHOW transaction_isolation;
m_db=# SHOW transaction_read_only;
-- GaussDB数据库同时设置多次隔离级别/事务访问模式，最后一个生效。
m_db=# SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED, ISOLATION LEVEL REPEATABLE READ, READ WRITE, READ ONLY;
m_db=# SHOW transaction_isolation; -- repeatable read
 transaction_isolation
-----------------------
 repeatable read
(1 row)
m_db=# SHOW transaction_read_only; -- on
 transaction_read_only
-----------------------
 on
(1 row)
```
#### START TRANSACTION差异
GaussDB数据库中，START TRANSACTION开启事务时，同时支持设置隔离级别；同时设置多次隔离级别/事务访问模式时，只有最后一个会生效；当前版本不支持立即开启一致性快照；多个事务特性支持空格和逗号分隔。
MySQL的START TRANSACTION开启事务时，不支持设置隔离级别，不支持设置多次事务访问模式；多个事务特性只支持逗号分隔。
在MySQL中，可重复读隔离级别下的事务，只有在执行第一个SELECT语句后才开始快照读。在GaussDB中，事务一旦开启，不仅第一个SELECT语句会进行快照读，第一个执行的DDL、DML或DCL语句也会建立事务的一致性读快照。
```
-- 开启事务设置隔离级别。
m_db=# START TRANSACTION ISOLATION LEVEL READ COMMITTED;
m_db=# COMMIT;
-- 多次设置访问模式。
m_db=# START TRANSACTION READ ONLY, READ WRITE;
m_db=# COMMIT;
```
#### 事务相关的GUC参数
表2事务相关的GUC参数差异 
| GUC参数                         | 功能                                                                                               | 差异                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
|:---|:---|:---|
| autocommit                    | 设置事务自动提交模式。                                                                                      | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| transaction_isolation         | 在GaussDB中是设置当前事务的隔离级别。 在MySQL中是设置会话级事务的隔离级别。     | - GaussDB中，通过使用SET transaction_isolation = value命令，只能改变当前事务的隔离级别。如果想要改变会话级的隔离级别，可以使用default_transaction_isolation。在MySQL中，通过使用SET命令，可以改变会话级的事务隔离级别。  - 支持范围差异。 MySQL中，支持以下隔离级别设置，对大小写不敏感，对空格敏感： - READ-COMMITTED  - READ-UNCOMMITTED  - REPEATABLE-READ  - SERIALIZABLE   GaussDB中，支持以下隔离级别设置，对大小写和空格敏感： - read committed  - read uncommitted  - repeatable read  - serializable  - default （设置和会话中默认隔离级别一样）     - 在GaussDB中，新事务的transaction_isolation值将被初始化为default_transaction_isolation的值。  - 设置m_format_dev_version = 's2'时： - 以下语句是设置下一个事务特性：set @@transaction_isolation = value; set transaction isolation level value。  - 以下语句修改会话级事务特性：set \[local\|session\|@@session.\] transaction_isolation = value。  - 下一个事务特性不允许在事务内使用，如果隐式事务报错，即单个SQL语句报错，继续保持下一个事务特性。     |
| tx_isolation                  | 设置事务的隔离级别； tx_isolation和transaction_isolation是同义词。 | GaussDB中只支持通过select @@语法查询，不支持通过show语法查询，不支持修改。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| default_transaction_isolation | 设置事务的隔离级别。                                                                                       | GaussDB中通过SET设置会改变会话级事务隔离级别。 MySQL中不支持该系统参数。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| transaction_read_only         | 在GaussDB中是设置当前事务的访问模式。 在MySQL中是设置会话级事务的访问模式。     | - 在GaussDB中，通过使用SET命令，只能改变当前事务的访问模式。如果想要改变会话级的访问模式，可以使用default_transaction_read_only。 在MySQL中，通过使用SET命令，可以改变会话级的事务隔离级别。   - 在GaussDB中，新事务的transaction_read_only值将被初始化为default_transaction_read_only的值。  - 设置m_format_dev_version = 's2'时： - 以下语句是设置下一个事务特性：set @@transaction_read_only = value; set transaction {read write \| read only}。  - 以下语句修改会话级事务特性：set \[local\|session\|@@session.\] transaction_read_only = value。  - 下一个事务特性不允许在事务内使用，如果隐式事务报错，即单个SQL语句报错，继续保持下一个事务特性。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| tx_read_only                  | 设置事务的访问模式。tx_read_only和transaction_read_only是同义词。                                                | GaussDB中只支持通过select @@语法查询，不支持通过show语法查询，不支持修改。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| default_transaction_read_only | 设置事务的访问模式。                                                                                       | GaussDB中通过SET设置会改变会话级事务访问模式；MySQL中不支持该系统参数。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
   
