事务指的是一序列 SQL 语句,OceanBase 将这组 SQL 语句当作一个整体,要么全部执行成功,要么全部不成功;不存在部分 SQL 语句执行成功,或者部分 SQL 没有执行成功的情形。
举个例子,当一个客户下单购买了一批商品时,订单表会新增几行记录购买信息和金额,库存表会更新这批商品的库存数量(扣减库存)。应用程序中为这个业务做设计时,就需要把 INSERT 和 UPDATE 语句放到一个事务里。
通常事务中的 SQL 会包含 DML 语句,也会包含查询语句。如果一个事务中的 SQL 只有查询语句,这个事务通常称为只读事务。
基本的事务控制语句有:
BEGIN,显式开启一个事务。这个命令是可选的,如果租户会话的参数 autocommit 值是 off (关闭自动提交),就不需要显式发出这个命令;如果参数值是 on (开启自动提交),那每条 SQL 就是一个独立的事务;如果要多个 SQL 组成一个事务,需要显式发起 BEGIN 命令。
SAVEPOINT,在事务过程中标记一个“保存点”,事务可以事后选择回滚到这个点。保存点是可选的,一个事务过程中也可以有多个保存点。
COMMIT,结束当前事务,让事务所有修改持久化并生效,清除所有保存点和释放事务持有的锁。
ROLLBACK,回滚整个事务已做的修改或者只回滚某个保存点之后事务已做的修改,清除回滚部分包含的所有保存点和释放事务持有的锁。
在 obclient 命令环境下,可以在 SQL 提示符后发起事务控制命令,也可以修改会话级别的 autocommit 参数。如果是修改租户级别的 autocommit 参数,需要断开会话重新连接才会生效。
说明
如果会话的 autocommit 参数值是 off 时,并且没有显式的提交事务,程序异常中断时,OceanBase 数据库会自动回滚最后一个未提交的事务。
建议显式的提交事务或者回滚事务。