首页 > 解决方案 > 可序列化的隔离级别和非数据库操作

问题描述

假设我已将隔离级别设置为可序列化和这样的事务:

  1. 一个新的交易被打开。
  2. 检索具有特定条件的所有元组。
  3. 如果不存在这样的行,则执行下一步,否则转到步骤 5。
  4. 在我的代码(非数据库操作)中设置一个标志,以防止将新的此类元组插入数据库。
  5. 事务已提交。

被执行。我的问题是,考虑到步骤 3 和 4 不是数据库操作,并且执行的最后一个数据库操作(提交除外)在步骤 2 中,我是否仍然可以确定只有在没有这样的情况下才设置标志元组已经在表中?换句话说,是否有可能在执行步骤 3 并且满足条件并且在执行步骤 4 之前(防止添加新的此类元组)另一个线程将一个这样的元组插入数据库并导致设置标志,而这样的一个元组在数据库中?

标签: databaseneo4jtransactionsrelational-databaseisolation-level

解决方案


它与 SQL 无关ISOLATION LEVEL。该要求涉及两个需要以事务方式同步的后端系统。一方,即 SQL 方,这一事实ISOLATION LEVEL是无关紧要的(更多,见下文)。

您需要 SQL 中所谓的两阶段提交(技术术语)。这允许您执行与 SQL 中的 ACID 事务同步的“非数据库操作”。所需的方法(和 SQL 命令)比您在问题中给出的步骤多一点。

  • 只有高端的商业 SQL 具有两阶段提交功能(它超出了 SQL 合规性要求)
  • 请注意,并非所有数据库系统都具有 SQL 合规性所需的特性和功能,例如 ACID 事务。因此,他们完全没有希望拥有 SQL 之外的 TPC。
  • 请注意,即使您的 SQL 可能有ISOLATION LEVEL,它也可能不支持 SQL ACID 事务。例如。MySQL 允许对CHECK约束进行编码,但它不执行编码检查。

选择

与其将所需的工具编写为以 SQL 为中心(您的问题),不如考虑在 SQL 之外编写它,并需要调用 SQL proc IFF。也就是说,将非 SQL 代码编写为 Atomic,其中包含 SQL 代码。


推荐阅读