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

Mia*_*aow 2 mysql database postgresql concurrency asynchronous

你好,

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

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

在我不需要查询结果来执行下一个(s)的情况下,有没有办法同时运行查询?

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

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

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

提前感谢您的时间!

Lau*_*lbe 6

是的,这是可能的;它被称为分布式事务。它是在 MySQL 和 PostgreSQL(以及我听说过的每个 RDBMS)中通过两阶段提交实现的。

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

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

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

成功准备好所有事务后,您就可以提交它们。这绝不应该失败,因为所有“艰苦的工作”在准备期间已经完成。

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

SQL 语句在 PostgreSQL 和 MySQL 中是不同的:

          |         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>
Run Code Online (Sandbox Code Playgroud)

请参阅PostgreSQLMySQL的文档。