TL;DR - MySQL 不允许您同时锁定表和使用事务。有没有办法解决?
我有一个 MySQL 表,用于缓存来自(慢)外部系统的一些数据。该数据用于显示网页(用 PHP 编写)。每隔一段时间,当缓存的数据被认为太旧时,其中一个 Web 连接应该触发缓存数据的更新。
我必须处理三个问题:
- 在我更新缓存数据时,其他客户端会尝试读取缓存数据
- 多个客户端可能认为缓存数据太旧并尝试同时更新它
- 执行工作的 PHP 实例随时可能意外终止,数据不应损坏
我可以通过使用事务来解决第一个和最后一个问题,因此客户端将能够读取旧数据,直到事务提交,他们将立即看到新数据。任何问题只会导致事务回滚。
我可以通过锁定表来解决第二个问题,这样只有一个进程有机会执行更新。当任何其他进程获得锁定时,他们会意识到他们已经被打败了,不需要更新任何东西。
这意味着我需要锁定表并启动事务。根据 MySQL 手册,这是不可能的。启动事务会释放锁,锁定表会提交任何活动事务。
有没有办法解决这个问题,还是有另一种方法可以完全实现我的目标?