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"。