显式事务

在 MatrixOne 的事务类别中,显式事务还遵循以下规则:

显式事务规则

  • 显式事务是指以 BEGIN...ENDSTART TRANSACTION...COMMITROLLBACK 作为起始结束。
  • 在显式事务中,DML(Data Manipulation Language,数据操纵语言)与 DDL(Data Definition Language,数据库定义语言)可以同时存在,支持除数据库与序列之外的所有对象类型的 DDL。
  • 显式事务中,无法嵌套其他显式事务,例如 START TRANSACTIONS 之后再遇到 START TRANSACTIONS,两个 START TRANSACTIONS 之间的所有语句都会强制提交,无论 AUTOCOMMIT 的值是 1 或 0。
  • 显式事务中,不能存在 SET 命令与管理类命令(CREATE USER/ROLEGRANT),只能包含 DML 与 DDL。
  • 显式事务中,如果在未发生显式提交或回滚而开启一个新事务而发生写写冲突,之前未提交的事务将会回滚并报错。

与 MySQL 显式事务的区别

事务类型开启自动提交关闭自动提交
显式事务与自动提交AUTOCOMMIT=1 时,MySQL 不会对事务进行任何更改,每个语句都会在一个新的自动提交事务中执行。AUTOCOMMIT=0 时,每个语句都会在显式开启的事务中执行,直到显式提交或回滚事务。
显式事务与非自动提交AUTOCOMMIT=1 时,MySQL 会在每个语句执行后自动提交未提交的事务。AUTOCOMMIT=0 时,每个语句都会在显式开启的事务中执行,直到显式提交或回滚事务。

MySQL 与 MatrixOne 显式事务行为示例

  1. mysql> CREATE TABLE Accounts (account_number INT PRIMARY KEY, balance DECIMAL(10, 2));
  2. Query OK, 0 rows affected (0.07 sec)
  3. mysql> INSERT INTO Accounts (account_number, balance) VALUES (1, 1000.00), (2, 500.00);
  4. Query OK, 2 rows affected (0.00 sec)
  5. mysql> BEGIN;
  6. Query OK, 0 rows affected (0.01 sec)
  7. mysql> UPDATE Accounts SET balance = balance - 100.00 WHERE account_number = 1;
  8. Query OK, 1 row affected (0.00 sec)
  9. mysql> UPDATE Accounts SET balance = balance + 100.00 WHERE account_number = 2;
  10. Query OK, 1 row affected (0.00 sec)
  11. mysql> COMMIT;
  12. Query OK, 0 rows affected (0.01 sec)
  13. mysql> BEGIN;
  14. Query OK, 0 rows affected (0.00 sec)
  15. mysql> UPDATE Accounts SET balance = balance - 100.00 WHERE account_number = 1;
  16. Query OK, 1 row affected (0.00 sec)
  17. mysql> UPDATE Accounts SET invalid_column = 0 WHERE account_number = 2;
  18. ERROR 20101 (HY000): internal error: column 'invalid_column' not found in table
  19. Previous DML conflicts with existing constraints or data format. This transaction has to be aborted
  20. mysql> ROLLBACK;
  21. Query OK, 0 rows affected (0.00 sec)
  22. mysql> SELECT * FROM Accounts;
  23. +----------------+---------+
  24. | account_number | balance |
  25. +----------------+---------+
  26. | 1 | 900.00 |
  27. | 2 | 600.00 |
  28. +----------------+---------+
  29. 2 rows in set (0.01 sec)

跨库事务行为示例

MatrixOne 支持跨库事务行为,这里将以一个简单的示例进行说明。

首先,让我们创建两个数据库(db1 和 db2)以及它们各自的表(table1 和 table2):

  1. -- 创建 db1 数据库
  2. CREATE DATABASE db1;
  3. USE db1;
  4. -- 创建 db1 中的表 table1
  5. CREATE TABLE table1 (
  6. id INT AUTO_INCREMENT PRIMARY KEY,
  7. field1 INT
  8. );
  9. -- 创建 db2 数据库
  10. CREATE DATABASE db2;
  11. USE db2;
  12. -- 创建 db2 中的表 table2
  13. CREATE TABLE table2 (
  14. id INT AUTO_INCREMENT PRIMARY KEY,
  15. field2 INT
  16. );

现在,我们已经创建了两个数据库和它们的表。接下来,我们将插入一些数据:

  1. -- db1 table1 中插入数据
  2. INSERT INTO db1.table1 (field1) VALUES (100), (200), (300);
  3. -- db2 table2 中插入数据
  4. INSERT INTO db2.table2 (field2) VALUES (500), (600), (700);

现在,我们已经有了两个数据库中的数据。接下来,我们将执行一个跨库事务,同时修改这两个数据库中的数据:

  1. -- 开始跨库事务
  2. START TRANSACTION;
  3. -- db1 中更新 table1 的数据
  4. UPDATE db1.table1 SET field1 = field1 + 10;
  5. -- db2 中更新 table2 的数据
  6. UPDATE db2.table2 SET field2 = field2 - 50;
  7. -- 提交跨库事务
  8. COMMIT;

在上面的跨库事务中,首先使用 START TRANSACTION; 开始事务,然后分别在 db1 和 db2 中更新了各自的表数据,最后使用 COMMIT; 提交事务。如果在事务期间任何一步失败,整个事务将回滚,以确保数据的一致性。

这个示例展示了一个完整的跨库事务,在实际应用中,跨库事务可能更加复杂,这个简单的示例可以帮助理解基本的概念和操作。