隐式事务¶
在 MatrixOne Intelligence 的事务类别中,隐式事务还遵循以下规则:
隐式事务规则¶
MatrixOne Intelligence 在
AUTOCOMMIT发生变化时,对于隐式事务未提交的情况会进行错误处理,并向用户提示需要先提交变化。在
AUTOCOMMIT=0且当前存在活跃事务的情况下,禁止修改自动提交与隔离级别,以及管理类与参数设置命令,例如SET、CREATE USER/ROLE或授权操作也将被限制。当
AUTOCOMMIT=1时,每条 DML 语句都被视为一个单独的事务,在执行后立即进行提交。而在
AUTOCOMMIT=0的情况下,每条 DML 语句在执行后并不会立即提交,需要手动执行COMMIT或ROLLBACK操作。若在尚未提交或回滚的状态下退出客户端,则默认进行回滚操作。在
AUTOCOMMIT=0的情况下,DML 与 DDL 可以同时存在于一个隐式事务中,但 DDL 的对象类型不能为数据库与序列。若在
AUTOCOMMIT=0的状态下出现CREATE/DROP DATABASE或CREATE/DROP SEQUENCE操作,则会强制提交之前未提交的所有内容。同时,CREATE/DROP DATABASE操作将会立即作为一个独立的事务进行提交。当存在未提交内容的隐式事务时,若启动一个显式事务,则会强制提交之前未提交的内容。
MatrixOne Intelligence 与 MySQL 隐式事务的区别¶
在 MatrixOne Intelligence 中,如果开启了隐式事务(SET AUTOCOMMIT=0),则所有操作都需要手动执行 COMMIT 或 ROLLBACK 来结束事务。相比之下,MySQL 在遇到 DDL 或类似 SET 语句时会自动提交。
MySQL 隐式事务行为¶
事务类型 |
开启自动提交 |
关闭自动提交 |
|---|---|---|
隐式事务与自动提交 |
当 |
当 |
隐式事务与非自动提交 |
当 |
当 |
MySQL 隐式事务行为示例
mysql> select @@SQL_SELECT_LIMIT;
+----------------------+
| @@SQL_SELECT_LIMIT |
+----------------------+
| 18446744073709551615 |
+----------------------+
1 row in set (0.01 sec)
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> set SQL_SELECT_LIMIT = 1;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@SQL_SELECT_LIMIT;
+--------------------+
| @@SQL_SELECT_LIMIT |
+--------------------+
| 1 |
+--------------------+
1 row in set (0.01 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@SQL_SELECT_LIMIT;
+--------------------+
| @@SQL_SELECT_LIMIT |
+--------------------+
| 1 |
+--------------------+
1 row in set (0.00 sec)
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> set SQL_SELECT_LIMIT = default;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@SQL_SELECT_LIMIT;
+----------------------+
| @@SQL_SELECT_LIMIT |
+----------------------+
| 18446744073709551615 |
+----------------------+
1 row in set (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@SQL_SELECT_LIMIT;
+----------------------+
| @@SQL_SELECT_LIMIT |
+----------------------+
| 18446744073709551615 |
+----------------------+
1 row in set (0.00 sec)
MatrixOne Intelligence 隐式事务行为示例
mysql> select @@SQL_SELECT_LIMIT;
+----------------------+
| @@SQL_SELECT_LIMIT |
+----------------------+
| 18446744073709551615 |
+----------------------+
1 row in set (0.01 sec)
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> set SQL_SELECT_LIMIT = 1;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@SQL_SELECT_LIMIT;
+--------------------+
| @@SQL_SELECT_LIMIT |
+--------------------+
| 1 |
+--------------------+
1 row in set (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@SQL_SELECT_LIMIT;
+--------------------+
| @@SQL_SELECT_LIMIT |
+--------------------+
| 1 |
+--------------------+
1 row in set (0.01 sec)
mysql> set autocommit=0;
ERROR 20101 (HY000): internal error: Uncommitted transaction exists. Please commit or rollback first.
隐式事务示例¶
例如,对 t1 插入数据 (4,5,6),即成为一个隐式事务。而该隐式事务是否立即提交,取决于 AUTOCOMMIT 参数的值:
CREATE TABLE t1(a bigint, b varchar(10), c varchar(10));
START TRANSACTION;
INSERT INTO t1 values(1,2,3);
COMMIT;
-- 查看 AUTOCOMMIT 开关参数
mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | 1 |
+---------------+-------+
1 row in set (0.00 sec)
-- 此处开始一个隐式事务,在 AUTOCOMMIT=1 的情况下,每一条 DML 在执行后立即提交
insert into t1 values(4,5,6);
-- 隐式事务自动提交,表数据如下所示
mysql> select * from t1;
+------+------+------+
| a | b | c |
+------+------+------+
| 1 | 2 | 3 |
| 4 | 5 | 6 |
+------+------+------+
2 rows in set (0.00 sec)