开启事务
OceanBase 数据库的事务控制语句与 MySQL 数据库兼容,开启事务可以通过以下方式来完成:
-
执行
START TRANSACTION
命令 -
执行
BEGIN
命令 -
执行
SET autocommit = 0
之后再执行的第一条语句
语法如下:
START TRANSACTION
[transaction_characteristic [, transaction_characteristic] ...]
transaction_characteristic: {
WITH CONSISTENT SNAPSHOT
| READ WRITE
| READ ONLY
}
BEGIN [WORK]
SET autocommit = {0 | 1}
提交事务
提交事务通过 COMMIT
命令来完成,具体语法如下所示:
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
此外,如果 autocommit = 0
,那么执行一条开启事务的语句也会隐式地提交当前进行中的事务。
回滚事务
回滚事务通过 ROLLBACK
命令来完成。
回滚事务的 SQL 语法如下:
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
自动提交
自动提交是指当 autocommit
这个 Session 变量的值为 1
时,此时每条语句执行结束后,OceanBase 数据库将会自动的把这条所在的事务提交。这样一来,一条语句就是一个事务。
隐式提交
隐式提交是用户未发出 COMMIT/ROLLBACK 等结束事务的语句给 OceanBase 数据库,而 OceanBase 数据库自动将当前活跃的事务执行 COMMIT 提交的过程。
隐式提交发生在以下情形:
-
执行一个开启事务的语句
-
执行 DDL
自动回滚
自动回滚是用户未发出 ROLLBACK 指令,而是 OceanBase 数据库内部发起的回滚,通常发生在以下情形:
-
session 断开
-
事务执行超时(ob_tx_timeout)
-
活跃事务的 session 超过一定时长没有语句执行(ob_tx_idle_timeout)
说明
ob_tx_timeout 用于设置事务超时时间,单位为微秒。
ob_tx_idle_timeout 用于设置事务空闲超时时间,即事务中两条语句之间的执行间隔超过该值时超时,单位为微秒。
有关变量的详细介绍,参见 《OceanBase 数据库参考指南》中 系统变量 章节。
这些情况下,事务自动被 OceanBase 数据库回滚,如果用户再次在当前 session(未断开)上执行 SQL 则会提示事务已经中断(无法继续)需要回滚,此时用户需要执行 ROLLBACK 来结束当前事务。
事务被中断
当事务执行过程中发生内部错误,如参与者节点宕机或者其它导致事务无法继续时,此时当前事务无法继续成功地执行语句,只能回滚。
此种情况发生时,用户执行 SQL 语句将会收到"transaction need rollback"的错误,用户需要执行 ROLLBACK 来结束当前事务。