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