我正在遵循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_trxid
或end_trxid
.然后表格的所有记录如下所示
+------+-------------+----------------------+
| x | start_trxid | end_trxid |
+------+-------------+----------------------+
| 1 | 77 | 18446744073709551615 |
| 5 | 84 | 18446744073709551615 |
| 3 | 77 | 18446744073709551615 |
+------+-------------+----------------------+
请注意,start_trxid
在此处自动更改为MariaDB84
。
我的问题:
如何指定增量为 1 的步长值。那么,更新后,下一个
start_trxid
应该是78
而不是84
?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
中看到的确切值,而是更大的值(。
因此,用户无法配置它。如果可能的话,那将是奇怪的 - 为了保持多个表,客户端会话和服务器重新启动之间的数据一致性,计数器必须是全局的,持久的,并且不断增加。