我被困在如何解决这个涉及 MySQL 事务的问题上。场景很复杂,但类似的情况如下:我有一个帖子表,标签通过一对一的关系(通过绑定表)绑定到这些帖子。那是三张桌子。
我想做的是“更新”一个帖子的正文,我通过创建一个副本来做到这一点(我们需要查看修订历史)。因此,我需要复制帖子,将其插入回帖子表中,并且至关重要的是,将所有标签绑定从旧帖子移动到新帖子。随后,我解析新帖子以获取新标签绑定,并通过绑定表将它们绑定到新帖子。
我需要确保所有这些步骤都完成,否则我将失去数据库内的完整性和一致性。将这些包装在 REPEATABLE_READ 隔离级别的 MySQL 事务中会导致一个基本问题:对标签绑定表的更新对于链下游的任何操作都无法访问。
也就是说,我将所有标签绑定从帖子 A 移动到帖子 B,然后将新绑定插入到帖子 A。这可能会失败,因为即使实际上它们已经移动,也会出现“重复的标签绑定”(在 REPEATABLE READ 中, INSERT/SELECT 语句反映的是事务前数据库的状态!)
我不确定如何保证一致性并能够解决这个问题。我可以将隔离级别降低到 READ_COMMITTED,但可能会出现脏读并且事务隔离丢失。
这是设计模式可以解决的问题吗?我很感激任何建议!我正在使用 MySQL、PHP(PDO 连接器)。
干杯,阿德里安