两个数据库和一个更新


Two databases and one update

我使用的是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请求并更新DB吗?低于

php page --send both requests via UDP--> dameon 
php page <--send successful receive via UDP-- dameon 
daemon --send two MySQL updates request --> MySQL

我会用mysql锁来解决这个问题。在进行mysql更新之前锁定表。只有当你也向斯芬克斯发送了更新后,才释放锁。

如果你有很多并发更新,可能不会扩展,但对于适度的更新率应该可以。