代码之家  ›  专栏  ›  技术社区  ›  Ettapp

MySQL/PostgreSQL-这是否可以在事务中执行并行写入?

  •  3
  • Ettapp  · 技术社区  · 6 年前

    你好

    如果我必须同时更新两个不同的行,但如果更新另一行失败,则不能更新其中一行,那么我当前的想法是使用事务。

    但事务是否能够执行并行操作?

    如果我不需要查询结果来执行下一个查询,是否有方法同时运行查询?

    这是一个理论问题,所以:

    • 行不必在同一个表上
    • 操作可以是update、insert或delete(在同一个表上,insert是按顺序处理的,但在许多不同的表中?)
    • 解决方案不必使用SQL(也许有一种方法可以从客户端获取某种“屏障事务”,然后异步运行查询?)

    通过在我的问题中寻找答案,我了解了关系数据库中的锁和并发问题,但没有找到我想要的。。。

    提前感谢您的宝贵时间!

    1 回复  |  直到 6 年前
        1
  •  8
  •   Laurenz Albe    6 年前

    是的,这是可能的;它被称为 distributed transaction 。它是通过以下方式实现的 two-phase commit 在MySQL和PostgreSQL(以及我所听说的所有RDBMS)中。

    其思想是在两个并发数据库会话上启动事务。当您必须在一个事务中回滚时,您也会在另一个事务中回滚。

    一旦你完成了工作 准备 两项交易。这是一个特殊的过程,它完成了实际提交以外的所有工作,因此可以保证后续提交工作正常。此外,必须持久化这样一个准备好的事务,以便它能够在崩溃中生存下来。

    如果数据库上的准备步骤失败,则回滚这两个事务。

    一旦成功准备好所有事务,就可以提交它们。这永远不会失败,因为所有的“艰苦工作”都是在准备过程中完成的。

    您需要一个协调该工作的组件。该组件称为 事务管理器 并且必须保持每个事务的状态,以便即使工作因崩溃或其他原因中断,也可以继续处理。此组件确保提交或回滚所有事务。

    PostgreSQL和MySQL中的SQL语句不同:

              |         PostgreSQL         |       MySQL
    ----------+----------------------------+--------------------
     start    | BEGIN                      | XA START
     prepare  | PREPARE TRANSACTION <name> | XA PREPARE <name>
     commit   | COMMIT PREPARED <name>     | XA COMMIT <name>
     rollback | ROLLBACK PREPARED <name>   | XA ROLLBACK <name>
    

    有关详细信息,请参阅文档 PostgreSQL MySQL .