首页 > 解决方案 > Databricks 表是否支持事务隔离级别

问题描述

我正在处理 Azure databricks 服务中的 databricks 表,但是,在我看来,databricks 表不支持事务隔离级别?当一个表被更新/删除/插入而另一个进程访问(读取/修改)同一个表时会发生什么?

标签: azure-databricks

解决方案


Azure Databricks 表架构是不可变的。

Azure Databricks 上的 Delta Lake 支持两个隔离级别:Serializable 和 WriteSerializable。

Delta Lake 在读取和写入之间提供 ACID 事务保证。这意味着:

  • 跨多个集群的多个写入者可以同时修改表分区并看到一致的表快照视图,并且这些写入将有一个串行顺序。
  • 读者继续看到 Azure Databricks 作业开始时使用的表的一致快照视图,即使在作业期间修改了表也是如此。

表的隔离级别定义了事务必须与并发事务所做的修改隔离的程度。Azure Databricks 上的 Delta Lake 支持两个隔离级别:Serializable 和 WriteSerializable。

可序列化:最强的隔离级别。它确保提交的写入操作和所有读取都是可序列化的。只要存在一次执行它们的串行序列,并且产生与表中所示相同的结果,就允许进行操作。对于写操作,串行顺序与表历史中看到的完全相同。

WriteSerializable(默认):比 Serializable 弱的隔离级别。它只确保写操作(即不是读操作)是可序列化的。但是,这仍然比快照隔离强。WriteSerializable 是默认的隔离级别,因为它为大多数常见操作提供了数据一致性和可用性的良好平衡。

在这种模式下,Delta 表的内容可能与从表历史记录中看到的操作序列预期的内容不同。这是因为这种模式允许某些并发写入对(例如,操作 X 和 Y)继续进行,即使历史显示 Y在 X 之后提交。要禁止这种重新排序,请将表隔离级别设置为 Serializable 以导致这些事务失败。

有关每个隔离级别中哪些类型的操作可能相互冲突以及可能出现的错误的更多信息,请参阅并发控制

有关更多详细信息,请参阅“ Azure Databricks - 隔离级别”。


推荐阅读