我正在使用Sphinx RT索引和MySQL数据库,我现在遇到的问题是我需要数据保持一致,并且在它们两者上使用常规插入不是正确的方法,因为我可能会结束错误的索引数据或错误的数据库数据。
假设您在MySQL DB中有以下表格
id, text
1, test is test
并且你在RT索引中也有相同的内容
id, text
这里可能发生的典型竞争条件是两个用户同时更新内容。
因此,如果用户A使用以下文本进行更新
feeling good
并且用户B使用以下文本进行更新
nice whether
可能发生的许多事情之一就是这个
Update RT index with user A text
Update DB table with user B text
Update RT index with user B text
Update DB table with user A text
所以现在当有人搜索文本时,他会从数据库中没有的索引中获得结果。
在中间有一个守护进程可以从PHP页面接收UDP请求并更新数据库吗?类似下面的内容
php page --send both requests via UDP--> dameon
php page <--send successful receive via UDP-- dameon
daemon --send two MySQL updates request --> MySQL
答案 0 :(得分:0)
我会用mysql锁来解决这个问题。在进行mysql更新之前锁定表。只有在您将更新发送到sphinx后才会释放锁定。
如果您有大量并发更新,可能无法扩展,但对于适度的更新速率应该可以正常工作。