TRANSACTION 
================================



描述 
-----------

该语句用于开启事务。

数据库事务（Database Transaction）是指作为单个逻辑工作单元执行的一系列操作。事务处理可以用来维护数据库的完整性，保证成批的SQL操作全部执行或全部不执行。

显示事务是用户自定义或用户指定的事务。通过 BEGIN TRANSACTION，或 BEGIN 和 BEGIN WORK（被作为START TRANSACTION的别名受到支持）语句显示开始，以 COMMIT 或 ROLLBACK 语句显示结束。

格式 
-----------

```javascript
transaction_stmt:
      START TRANSACTION [READ ONLY | READ WRITE];
    | BEGIN [WORK];
    | COMMIT [WORK];
    | ROLLBACK [WORK];
    | SET TRANSACTION {READ ONLY | READ WRITE};
```



参数解释 
-------------



|                    **参数**                     |                                                                                   **描述**                                                                                   |
|-----------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| START TRANSACTION \[READ ONLY \| READ WRITE\] | 开启事务语句。一旦开启事务，则随后的 SQL 数据操作语句（即INSERT、UPDATE、DELETE等）直到显式提交时才会生效。 READ ONLY 子句表示事务是只读方式开启，事务内不允许执行修改操作。 READ WRITE 子句表示事务是读写方式开启，默认就是此种模式。 |
| BEGIN                                         | BEGIN 和 BEGIN WORK 被作为 START TRANSACTION 的别名受到支持                                                                                                                           |
| COMMIT                                        | 提交当前事务。                                                                                                                                                                    |
| ROLLBACK                                      | 回滚当前事务。                                                                                                                                                                    |
| SET TRANSACTION {READ ONLY \| READ WRITE}     | 将当前事务设置成 READ ONLY 或者 READ WRITE 模式。                                                                                                                                       |



示例 
-----------

假设现有表 a 如下所示。


| id | name | num |      sell_date      |
|----|------|-----|---------------------|
| 1  | a    | 100 | 2013-06-21 10:06:43 |
| 2  | b    | 200 | 2013-06-21 13:07:21 |
| 3  | a    | 50  | 2013-06-21 13:08:15 |



1. 依次执行以下命令开始执行事务，将 id 为 3 的的 name 改为 c，并插入一行当前卖出 a 的记录。




```javascript
OceanBase(admin@test)> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

OceanBase(admin@test)> UPDATE a SET name = 'c' WHERE id = 3;
Query OK, 1 rows affected (0.00 sec)

OceanBase(admin@test)> INSERT INTO a VALUES (4, 'a', 30, '2013-06-21 16:09:13');
Query OK, 1 rows affected (0.00 sec)

OceanBase(admin@test)> COMMIT;
Query OK, 0 rows affected (0.00 sec)
```



2. 事务提交后，执行命令查看表 a 信息。




```javascript
SELECT * FROM a;
```



结果如下：


| id | name | num |      sell_date      |
|----|------|-----|---------------------|
| 1  | a    | 100 | 2013-06-21 10:06:43 |
| 2  | b    | 200 | 2013-06-21 13:07:21 |
| 3  | c    | 50  | 2013-06-21 13:08:15 |
| 4  | a    | 30  | 2013-06-21 16:09:13 |


**注意**



在事务还没有 COMMIT 之前，您可以查看下本事务中的操作是否已经生效，比如可以在 COMMIT 前，加一句" **SELECT \* FROM a;** "。本事务 session 的访问能读到最新的结果，本事务 session 之外的访问结果肯定是没有生效，在事务还没有 COMMIT 前，你之前做的操作除当前事务连接之外都是不可见的。如果您想回滚该事务，直接用"ROOLBACK"代替"COMMIT"。

