mysql - 在数据库事务期间等待另一个进程

标签 mysql database amazon-web-services transactions

我有一个应用程序,它将文件存储在 AWS S3 中,并将文件元数据存储在 MySQL 中。每个操作(上传、更新、删除)通常需要更新 S3 和 DB。

如何使这样的 Action “原子化”?我可以将其包装到数据库事务中,该事务将等到 S3 操作完成吗? 示例:

DB transaction start
Make an S3 action (can take a few seconds)
Make a DB action(s)
DB transaction commit

目前,我在数据库事务之外调用 S3 操作,因为我倾向于使数据库事务尽可能短,这样它们就不会锁定数据库,这当然会在以下情况下导致潜在的数据不一致:数据库操作未成功。

你会推荐什么?我可以使用建议的方法还是有其他方法可以做到这一点?我正在考虑 XA 事务、AWS 队列;我尝试做一些研究,但令人惊讶的是没有发现任何有用的东西。

我的服务器端技术是php。 谢谢。

最佳答案

这就是我们所做的(不完全是 S3 和 DB),而是类似的分布式提交:

  • 执行 S3 操作
  • 数据库事务开始
  • 执行数据库操作
    • 如果 DB 操作引发异常,则恢复* S3 中的操作
    • 如果数据库操作成功,则提交并完成。

恢复 - 可能会涉及一些内容,具体取决于原始操作是插入还是更新。

关于mysql - 在数据库事务期间等待另一个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28602372/

相关文章:

python - 为 django 模型自动创建数据的工具

database - ORA-00060 : deadlock detected while waiting for resource

java - 我可以使用什么方法通过 Java 配置/更新弹性负载均衡器?

java - 错误: JPA + MySQL Transaction is not active in the current thread

mysql - 如何计算重复的列?

php - 如何处理共享公共(public) ID 的 SQL 查询的多个结果?

database - 在 Xcode 环境中为 Swift 安装最新的 Realm (0.102.0) 失败

mysql - 如何将应用程序移动到 Cassandra?

amazon-web-services - 如何使用从一个 Terraform 计划创建到另一个 Terraform 计划的 VPC id 和子网 id 值

amazon-web-services - ansible-playbook 是否使用之前创建的变更集(如果存在)或者是否使用 playbook 和 var 运行?