azure-databricks - Databricks 表是否支持事务隔离级别
问题描述
我正在处理 Azure databricks 服务中的 databricks 表,但是,在我看来,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 - 隔离级别”。
推荐阅读
- javascript - 从浏览器的 es6 模块中无法识别的 node_modules 导入
- android - 如何以编程方式将背景颜色从 android.support.design 更改为 MaterialButton
- osgi - 在 OSGI 容器中启动 Apache Ignite 时出错
- git - Jenkins - 当 Jenkins 构建失败时阻止合并按钮
- uml - 扩展用例的正确表示法
- java - 输入“Q”时如何使Java程序退出,问题是默认输入变量是double
- python - 如何解决最大递归深度错误
- javascript - JavaScript 数组:有没有一种方法可以在拼接和过滤器之间进行交叉处理?
- google-container-registry - 是否可以在不在本地安装 docker 的情况下向谷歌云容器注册表中的图像添加标签?
- android - 如何使用 OpenCV 在 Android 中将原始图像转换为 RGB?