是否可以将 Sphinx RT 索引与 Mysql innodb 表结合使用来支持事务?
例如,我在 mysql 中有一个表 products,我在 Sphinx 中构建了一个实时索引以进行全文搜索。当在 mysql 中更新产品行时,我希望 Sphinx 中的索引也必须实时更新,以便立即对更新产品进行全文搜索,但都以一致的方式进行。
如果产品行更新失败或实时索引更新失败,都必须回滚以避免不一致。有可能的?我怎样才能得到这个?
是的,这是可能的,但它有一些怪癖。Sphinx 支持事务(开始/语句/(提交,回滚)),但仅限于单个实时索引。这意味着,如果您想在单个事务中写入多个索引,它将无法工作。假设您有以下 mysql 表和 sphinx 实时索引,它们之间有直接的对应关系:
posts_db -> posts_rt
comments_db -> comments_rt
在 mysql 中,很容易在单个事务中写入两个表:
START TRANSACTION;
INSERT INTO posts_db ...;
INSERT INTO comments_db ...;
COMMIT or ROLLBACK; // so far everthing ok
但是如果你想对 sphinx 做同样的事情,它会失败:
START TRANSACTION;
INSERT INTO posts_rt ...;
// when executing the next statement you'll get an error
INSERT INTO comments_rt ...; // ERROR 1064 (42000): current txn is working with another index ('posts_rt')
在 sphinx 中,您一次只能使用一个索引:
START TRANSACTION;
INSERT INTO posts_rt ...;
COMMIT or ROLLBACK; // so far everthing ok
START TRANSACTION;
INSERT INTO comments_db ...;
COMMIT or ROLLBACK; // so far everthing ok
这很糟糕!这对于单索引应用程序来说很好,但对于其他情况,您必须使用 php 或您使用的任何东西来模拟事务。
对的,这是可能的。这是实时索引的描述 http://sphinxsearch.com/docs/current.html#rt-indexes