Существует ли отметка времени начала транзакции — СЕЙЧАС() для оператора txn start — not start

#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)