我有一个应用程序,它将文件存储在 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/