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

时间:2018-05-17 13:06:18

标签: mysql database postgresql asynchronous concurrency

您好,

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

但交易是否能够执行并行操作?

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

这是一个理论上的问题:

  • 行不必在同一张桌子上
  • 操作可以是更新,插入或删除(在同一个表上,插入是按顺序处理的,但是在许多不同的表中?)
  • 解决方案不一定要在SQL中(也许有办法从客户端获得一种" barrier-transaction"然后异步运行查询?)

我通过在我的问题上寻找答案但没有找到我想要的东西来了解关系数据库中的锁定和连贯性问题......

提前感谢您的时间!

1 个答案:

答案 0 :(得分:3)

是的,这是可能的;它被称为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的文档。