【问题标题】:MySQL / PostgreSQL - Is this possible to perform parallel write in a transaction?MySQL / PostgreSQL - 这可以在事务中执行并行写入吗?
【发布时间】:2018-05-17 13:06:18
【问题描述】:

嗨,

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

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

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

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

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

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

提前感谢您的宝贵时间!

【问题讨论】:

    标签: mysql database postgresql asynchronous concurrency


    【解决方案1】:

    是的,这是可能的;它被称为distributed transaction。它在 MySQL 和 PostgreSQL(以及我听说过的每个 RDBMS)中都使用 two-phase commit 实现。

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

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

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

    一旦成功准备好所有事务,您就可以提交它们。这绝不应该失败,因为所有“艰苦的工作”都已经在准备过程中完成了。

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

    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>
    

    请参阅 PostgreSQLMySQL 的文档。

    【讨论】:

    • "...保证后续提交工作" PostgreSQL 不保证这一点。它只是提供“......它可以成功提交的可能性非常高......”
    • 你是绝对正确的。当然,这更多的是理论概念,而不是现实,正如我们所知,没有什么是 100% 的。我会改写它。
    猜你喜欢
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多