提问者:小点点

是否应该将mysql事务隔离级别设置为“读取提交”?


在我的airflow升级到2.0.0(然后是2.0.1)并且调度程序扩展到3个节点之后,奇怪的事情发生了:

  • DAGRUNN成功,但根本没有计划任务实例
  • 任务失败,主机名为空(https://github.com/apache/airflow/issues/13692)
  • 任务设置为“upstream_failed”,而上游任务成功(https://github.com/apache/airflow/issues/13671)

当只有一个调度器节点时,这些现象从未发生过。

并且我发现在一个调度器节点创建了一个新的dagrun的任务实例之后,在另一个调度器节点的task_instance_scheduling_decisions函数中找不到它们。

然后我检查了mysql配置,发现事务隔离默认设置为可重复读取。

在我将事务隔离设置为read commited之后,现在似乎一切都很好。但我还是想知道有没有副作用?


共1个答案

匿名用户

是的,提交的读取不同于可重复的读取。

如果使用可重复读取,则在此事务中:

START TRANSACTION;

SELECT * FROM mytable;

SELECT * FROM mytable; -- i.e. the same query

COMMIT;

您可以保证两个选择返回相同的结果(只要它们不是锁定查询)。

但在READ COMMITTED中,如果其他会话在两个选择之间提交了对数据的更改,则会返回不同的结果。

换句话说,可重复读取意味着您的SELECT查询总是返回在启动事务启动时提交的数据。而READ COMMITTED意味着您的SELECT查询返回在事务启动后提交的数据,直到每个相应的SELECT启动时为止。

这两个级别的事务隔离都有适当的用途。但他们的行为确实不一样。