#transactions #mariadb #sql-function
Вопрос:
Я исследую временные запросы и обнаружил, что, по моему мнению, проблема с MariaDB (я следовал инструкциям здесь), хотя их реализация временных запросов кажется одной из лучших. Код MariaDB находится на этой скрипке (скрипка сравнения PostgreSQL).
Однако в ходе моих исследований я обнаружил, что в MariaDB отсутствует transaction_timestamp()
функция, как в PostgreSQL.
PostgreSQL также предоставляет функции, возвращающие время начала текущего оператора, а также фактическое текущее время в момент вызова функции. Полный список функций времени, отличных от стандартных функций SQL:
transaction_timestamp() statement_timestamp() clock_timestamp() timeofday() now()
Я сделал следующее (шаги здесь):
create table t
(
x int, test timestamp(6),
start_tid bigint unsigned generated always as row start invisible,
end_tid bigint unsigned generated always as row end invisible,
period for system_time(start_tid, end_tid)
) with system versioning;
Затем побежал:
start transaction;
insert into t (x, test) values (1, now()), (2, now()), (3, now());
select sleep (5); -- inagine this is some (very) long-running report query
insert into t (x, test) values (11, now()), (12, now()), (13, now());
commit work;
и затем:
select
x, test, start_tid, end_tid
from t;
получил
x test start_tid end_tid
1 2021-11-07 11:43:25 60612 18446744073709551615
2 2021-11-07 11:43:25 60612 18446744073709551615
3 2021-11-07 11:43:25 60612 18446744073709551615
-- notice 5 second gap here!
11 2021-11-07 11:43:30 60612 18446744073709551615
12 2021-11-07 11:43:30 60612 18446744073709551615
13 2021-11-07 11:43:30 60612 18446744073709551615
Итак, у меня есть временные метки, в которые произошли два разных набора вставок, но чего я не могу получить, так это время начала одной транзакции для всей транзакции в MariaDB.
Выполнение почти того же самого в PostgreSQL (скрипка) дает мне результат
x tx_time clock_time
1 2021-11-07 12:01:05.574651 2021-11-07 12:01:05.575062
2 2021-11-07 12:01:05.574651 2021-11-07 12:01:05.575145
3 2021-11-07 12:01:05.574651 2021-11-07 12:01:05.57515
-- here, the tx_time remains unchanged whereas the clock_time changes by 5 seconds as wanted
11 2021-11-07 12:01:05.574651 2021-11-07 12:01:10.577289
12 2021-11-07 12:01:05.574651 2021-11-07 12:01:10.577307
13 2021-11-07 12:01:05.574651 2021-11-07 12:01:10.577324
Может быть, я мог бы присоединиться к таблице mysql.transaction_registry, но предпочел бы сделать это в SQL?
Ответ №1:
MariaDB [halley]> TRUNCATE TABLE t;
Query OK, 0 rows affected (0.526 sec)
MariaDB [halley]> start transaction;
Query OK, 0 rows affected (0.000 sec)
MariaDB [halley]> SELECT @T:=now();
---------------------
| @T:=now() |
---------------------
| 2021-11-07 16:21:15 |
---------------------
1 row in set (0.000 sec)
MariaDB [halley]> insert into t (x, test) values (1, @T), (2, @T), (3, @T);
Query OK, 3 rows affected (0.000 sec)
Records: 3 Duplicates: 0 Warnings: 0
MariaDB [halley]> select sleep (5); -- inagine this is some (very) long-running report query
-----------
| sleep (5) |
-----------
| 0 |
-----------
1 row in set (5.000 sec)
MariaDB [halley]> insert into t (x, test) values (11, @T), (12, @T), (13, @T);
Query OK, 3 rows affected (0.000 sec)
Records: 3 Duplicates: 0 Warnings: 0
MariaDB [halley]> commit work;
Query OK, 0 rows affected (0.037 sec)
MariaDB [halley]> select
-> x, test, start_tid, end_tid
-> from t;
------ ---------------------------- ----------- ----------------------
| x | test | start_tid | end_tid |
------ ---------------------------- ----------- ----------------------
| 1 | 2021-11-07 16:21:15.000000 | 755 | 18446744073709551615 |
| 2 | 2021-11-07 16:21:15.000000 | 755 | 18446744073709551615 |
| 3 | 2021-11-07 16:21:15.000000 | 755 | 18446744073709551615 |
| 11 | 2021-11-07 16:21:15.000000 | 755 | 18446744073709551615 |
| 12 | 2021-11-07 16:21:15.000000 | 755 | 18446744073709551615 |
| 13 | 2021-11-07 16:21:15.000000 | 755 | 18446744073709551615 |
------ ---------------------------- ----------- ----------------------
6 rows in set (0.000 sec)