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

标签 mysql database postgresql asynchronous concurrency

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

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

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

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

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

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

最佳答案

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

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

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

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

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

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

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 .

关于MySQL/PostgreSQL - 是否可以在事务中执行并行写入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50392243/

相关文章:

javascript - Webkit下载预建数据库

php - 找不到检查用户是否已存在的方法

postgresql - 露天 Javamelody

php - 如何比较具有不同数量值的数据

c# - 数据库连接关闭位置在try catch/using中

jquery - laravel 不使用 ajax 插入到 mysql

postgresql - 如何根据开始日期的星期几计算下一个发生日期?

sql - MySQL 查询 : find any record with a PENDING status and find any records with a FAILED status

mysql - 包含金钱和期间的数据库表设计

python - 使用在服务器上运行的 python 脚本和存储过程有什么区别?