如何在MariaDB的时态数据表中使事务标识符版本逐个递增



我正在遵循MariaDB系统版本控制表,并按照事务精确历史记录中所述的示例进行操作。

表架构是根据文档创建的,

CREATE TABLE t(
x INT,
start_trxid BIGINT UNSIGNED GENERATED ALWAYS AS ROW START,
end_trxid BIGINT UNSIGNED GENERATED ALWAYS AS ROW END,
PERIOD FOR SYSTEM_TIME(start_trxid, end_trxid)
) WITH SYSTEM VERSIONING;

我的初始表t具有如下数据。

+------+-------------+----------------------+
| x    | start_trxid | end_trxid            |
+------+-------------+----------------------+
|    1 |          77 | 18446744073709551615 |
|    2 |          77 | 18446744073709551615 |
|    3 |          77 | 18446744073709551615 |
+------+-------------+----------------------+

然后我使用UPDATE t SET x=5 WHERE x=2更新x=2值。请注意,我没有指定start_trxidend_trxid.然后表格的所有记录如下所示

+------+-------------+----------------------+
| x    | start_trxid | end_trxid            |
+------+-------------+----------------------+
|    1 |          77 | 18446744073709551615 |
|    5 |          84 | 18446744073709551615 |
|    3 |          77 | 18446744073709551615 |
+------+-------------+----------------------+

请注意,start_trxid在此处自动更改为MariaDB84

我的问题

  1. 如何指定增量为 1 的步长值。那么,更新后,下一个start_trxid应该是78而不是84

  2. MariaDB是如何选择77初始值的。是否有任何配置可以从1开始(种子值(?

我们真的能控制这里的递增步骤吗?我尝试手动设置start_trxid,但显然失败了。

我尝试查找有关此的任何文档,但找不到任何内容。

这些是来自InnoDB事务计数器的值,当您执行SHOW ENGINE INNODB STATUS时,您会看到的值:

MariaDB [test]> SHOW ENGINE INNODB STATUS G
...
------------
TRANSACTIONS
------------
Trx id counter 58
...
MariaDB [test]> insert into t (x) values (1);
Query OK, 1 row affected (0.091 sec)
MariaDB [test]> select * from t;
+------+-------------+----------------------+
| x    | start_trxid | end_trxid            |
+------+-------------+----------------------+
|    1 |          58 | 18446744073709551615 |
+------+-------------+----------------------+
MariaDB [test]> SHOW ENGINE INNODB STATUS G
...
------------
TRANSACTIONS
------------
Trx id counter 65
...
MariaDB [test]> insert into t (x) values (2);
Query OK, 1 row affected (0.024 sec)
MariaDB [test]> select * from t;
+------+-------------+----------------------+
| x    | start_trxid | end_trxid            |
+------+-------------+----------------------+
|    1 |          58 | 18446744073709551615 |
|    2 |          65 | 18446744073709551615 |
+------+-------------+----------------------+
2 rows in set (0.001 sec)

(由于内部逻辑,即使您只有一个客户端会话,您也可能得到的不是上次在SHOW ENGINE INNODB STATUS中看到的确切值,而是更大的值(。

因此,用户无法配置它。如果可能的话,那将是奇怪的 - 为了保持多个表,客户端会话和服务器重新启动之间的数据一致性,计数器必须是全局的,持久的,并且不断增加。

最新更新