首页 > 解决方案 > MySQL / PostgreSQL - 这可以在事务中执行并行写入吗?

问题描述

你好,

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

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

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

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

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

提前感谢您的宝贵时间!

标签: mysqldatabasepostgresqlasynchronousconcurrency

解决方案


是的,这是可能的;它被称为分布式事务。它是在 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>

请参阅PostgreSQLMySQL的文档。


推荐阅读