TL; DR - MySQL不允许您锁定表并同时使用事务。有没有办法解决?MySQL:如何锁定表并启动事务?
我有一个MySQL表我用来缓存一些(慢)外部系统的数据。这些数据用于显示网页(用PHP编写)。每隔一段时间,当缓存的数据被认为太旧时,其中一个网络连接应该会触发对缓存数据的更新。
有三个问题,我不得不面对:
- 其他客户端将尝试读取缓存中的数据,而我更新它
- 多个客户端可以决定缓存的数据太旧,并尝试同时
- PHP的情况下做的工作可以在任何时候意外终止更新,数据不应该被破坏
我能解决的第一个和最后通过使用事务处理问题,因此客户将能够读取旧数据,直到事务提交,并立即看到新数据。任何问题只会导致事务回滚。
我可以通过锁定表来解决第二个问题,以便只有一个进程有机会执行更新。当其他进程获得锁定时,他们会意识到他们已经被击败了,并且不需要更新任何东西。
这意味着我需要同时锁定表和开始交易。根据MySQL手册,this is not possible。启动事务将释放锁,并锁定表提交任何活动的事务。
有没有办法解决这个问题,还是有另一种方法来完成我的目标?
谢谢,这似乎工作得很好! – Malvineous