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

Waiting for another process during a DB transaction

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

如何让这样的动作“原子化”?我可以将它包装到数据库事务中,等待 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 中的操作
    • 如果数据库操作成功,提交并完成。

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