mysql - MySQL / PostgreSQL - 这可以在事务中执行并行写入吗?
问题描述
你好,
如果我必须同时更新两行不同的行,但如果另一行的更新失败则不能更新,我目前的想法是使用事务。
但是事务能够执行并行操作吗?
在我不需要查询结果来执行下一个查询的情况下,有没有办法同时运行查询?
这是一个理论问题,所以:
- 行不必在同一张桌子上
- 操作可以是更新、插入或删除(在同一个表上,插入是按顺序处理的,但在许多不同的表中?)
- 解决方案不必在 SQL 中(也许有一种方法可以从客户端获取一种“屏障事务”,然后异步运行查询?)
我通过在我的问题中寻找答案来了解关系数据库中的锁和并发问题,但没有找到我想要的东西......
提前感谢您的宝贵时间!
解决方案
是的,这是可能的;它被称为分布式事务。它是在 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的文档。
推荐阅读
- c# - 我是编程和 C# 的新手,我的学校作业输出错误
- c# - 如何在 C# 中检查 2 或 3 个应用程序是否打开并处于活动状态
- java - Oracle JDBC Thin:强制网络加密
- sharepoint-online - 如何使用 Power 自动化或 Rest API 向 SharePoint 文档库/列表上的用户授予访问权限
- r - 绘制统计功效与重复并计算系数的平均值
- python - 忽略命令中的异常无:discord.ext.commands.errors.CommandNotFound:找不到命令“加入”错误
- mysql - 使用 MySQL REGEXP 通过 Django ORM 过滤字符串
- plotly-dash - 从回调中选择数据表活动/选定单元格
- javascript - 在多行js字符串中插入重音
- javascript - React Hooks - useFetch 泛化