在我的airflow升级到2.0.0(然后是2.0.1)并且调度程序扩展到3个节点之后,奇怪的事情发生了:
当只有一个调度器节点时,这些现象从未发生过。
并且我发现在一个调度器节点创建了一个新的dagrun的任务实例之后,在另一个调度器节点的task_instance_scheduling_decisions函数中找不到它们。
然后我检查了mysql配置,发现事务隔离默认设置为可重复读取。
在我将事务隔离设置为read commited之后,现在似乎一切都很好。但我还是想知道有没有副作用?
是的,提交的读取不同于可重复的读取。
如果使用可重复读取,则在此事务中:
START TRANSACTION;
SELECT * FROM mytable;
SELECT * FROM mytable; -- i.e. the same query
COMMIT;
您可以保证两个选择返回相同的结果(只要它们不是锁定查询)。
但在READ COMMITTED中,如果其他会话在两个选择之间提交了对数据的更改,则会返回不同的结果。
换句话说,可重复读取意味着您的SELECT查询总是返回在启动事务启动时提交的数据。而READ COMMITTED意味着您的SELECT查询返回在事务启动后提交的数据,直到每个相应的SELECT启动时为止。
这两个级别的事务隔离都有适当的用途。但他们的行为确实不一样。