在 mariadb 事件中设置事务隔离级别

问题描述 投票:0回答:1

我有一个 mariaDB 事件,每小时运行一次,并将数据从多个表复制到其他表。由于我使用的是 INSERT INTO SELECT,并且其中一个表相当大,因此我最终遇到了死锁,因为其中一个表中的一个“插入到 select”花费的时间太长,并且该表当前正在使用生产环境。

如果我在事件开始时将TRANSACTION ISOLATION LEVEL更改为READ UNCOMMITTED,我不再有死锁,并且可能的数据不一致对我来说不是问题,但我不确定我是否要更改仅针对此事件会话的事务隔离级别(有这样的事情吗?),或者如果我要在更高级别上更改事务隔离级别(并且可能为所有会话更改它?)。

DELIMITER $$
CREATE EVENT event_name
ON SCHEDULE EVERY 1 HOUR
STARTS '2024-05-23 21:00:00'
DO
BEGIN
    SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    /*<sql code>*/
    SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; /* resetting to the previous value*/
END$$

我没有找到有关更改 mariadb/mysql 事件的事务隔离级别的信息。有人有这方面的资料吗

我知道对于此数据复制作业我有许多其他选项,但我目前有时间/资源限制,并且我无法以其他方式处理它。

谢谢大家

mysql mariadb database-deadlocks mysql-event database-events
1个回答
0
投票

您仅更改当前会话的事务隔离级别。

让我详细说明一下:

您有一个 MariaDB 的 RDBMS,它对 0 个或多个连接开放。

一个这样的连接会创建一个会话。因此,如果您通过某个程序或命令行连接到 RDBMS,那么您会为您创建一个会话,并且这种事务隔离级别修改只会修改您的连接/会话级别上的事务隔离级别,并保留其他连接完好无损。

因此,由于这是在您的 MariaDB 事件空间中,因此它不应该影响其他任何事情。但不要相信我,你自己验证一下。连接到您的 MariaDB 并运行此命令:

SELECT @@GLOBAL.tx_isolation, @@tx_isolation;

从另一个源再次连接到 MariaDB,无需断开此连接并运行上面的命令。

现在,让我们更改其中一个连接的会话事务隔离级别,并在另一个连接上重新运行此命令。合理的预期是会话事务隔离级别在其他连接中保持不变,但在您更改它的连接中它将发生变化。

© www.soinside.com 2019 - 2024. All rights reserved.