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