数据库mysql/postgresql是否可以在事务中执行并行写入?

zte4gxcn  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(372)

你好,
如果我必须同时更新两个不同的行,但如果更新另一行失败,则不能更新其中一行,我当前的想法是使用事务。
但是事务能够执行并行操作吗?
如果我不需要查询结果来执行下一个查询,有没有办法同时运行查询?
这是一个理论问题,所以:
行不必在同一个表上
操作可以是update、insert或delete(在同一个表上,insert是顺序处理的,但在许多不同的表中?)
解决方案不必是sql(也许有一种方法可以从客户机获得一种“屏障事务”,然后异步运行查询?)
通过寻找问题的答案,我了解了关系数据库中的锁和并发性问题,但没有找到我想要的。。。
提前感谢您的时间!

cl25kdpy

cl25kdpy1#

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

请参阅postgresql和mysql的文档。

相关问题