【问题标题】:Two databases and one update两个数据库和一个更新
【发布时间】:2013-07-04 00:07:26
【问题描述】:

我正在使用 Sphinx RT 索引和 MySQL DB,我现在遇到的问题是我需要数据保持一致,并且对它们使用常规插入不是正确的方法,因为我可能会结束出现错误的索引数据或错误的数据库数据。

假设您在 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

【问题讨论】:

  • 守护进程有什么意义?这能解决什么问题?

标签: php mysql concurrency sphinx daemon


【解决方案1】:

我会用 mysql 锁来解决这个问题。在进行 mysql 更新之前锁定表。只有在您也将更新发送到 sphinx 后才释放锁定。

如果您有大量并发更新,可能无法扩展,但对于适度的更新率应该可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多