如果我必须同时更新两个不同的行,但如果另一个更新失败则不能更新一个,我目前的想法是使用事务。
但是事务能够执行并行操作吗?
如果我不需要查询结果来执行下一个查询,有没有办法同时运行查询?
这是一个理论问题,所以:
- 行不必在同一个表上
- 操作可以是更新、插入或删除(在同一个表上,插入是按顺序处理的,但在许多不同的表中?)
- 解决方案不必在 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/