3

我遇到了与此处描述的问题类似的问题:

如何在 mssql 的事务中强制刷新全文索引?

但是,那里发布的推荐解决方案不起作用。我尝试在同一个主题上发布后续内容,但它被版主删除了。所以我开始一个新的问题。

与原始查询类似,我也尝试在事务中实现单元测试。我想将数据插入全文索引列,查询数据以检查其有效性,然后回滚插入。

问题是在我提交事务之前索引似乎没有更新。我已经尝试过“WAITFOR DELAY”方法,但是无论我等待多长时间索引都不会更新,直到事务提交之后。

这是我正在尝试做的一个示例:

BEGIN TRAN

INSERT INTO AMMS.Content
(
    ContentTypeId,
    Name,
    ImportDate,
    IsDeleted,
    LastModifiedBy,
    LastModifiedAt,
    DisplayInPortal,
    StatusId
)
VALUES
(
    4,
    'my unit test content',
    GETUTCDATE(),
    0,
    1,
    GETUTCDATE(),
    1,
    2
)

declare @count int
set @count = 0
while @count < 10
begin
    SELECT FULLTEXTCATALOGPROPERTY('PRIMARY', 'PopulateStatus') AS Status
    select * from amms.Content where contains(Name, 'unit')
    waitfor delay '00:00:01'
    set @count = @count + 1
end

填充状态保持在 9 并且只要事务处于挂起状态,选择就不会返回任何行。一旦我提交填充状态返回 0 并且选择按预期返回单行。

我错过了什么吗?还有另一种方法可以做到这一点吗?这种行为在不同版本的 SQL Server 下是否有所不同?(我目前正在使用 2008 进行测试)

4

2 回答 2

1

我觉得你运气不好。尝试在事务中启动手动刷新...

begin tran
alter fulltext index on dbo.FTS_Table start full population

...给我这个信息:

消息 574,级别 16,状态 0,第 1 行 ALTER FULLTEXT INDEX 语句不能在用户事务中使用。

您有哪些替代方案可能取决于您管理单元测试的方式,也许您可DELETE​​以再次使用数据,或者DROP如果表仅用于此测试,则可以完全使用。

于 2013-01-10T20:56:06.207 回答
0

本质上,SQL Server 不会让您在事务(或快照)中执行某些操作。

由于存在争用的风险和文本索引的巨大开销,索引服务尤其刻意在用户连接的外部运行。

如果您退后一步考虑对任何其他数据库连接的影响,以及对当前重写全文索引的事务的影响,我相信您会理解在这种情况下,Microsoft 是有道理的。

于 2017-02-10T08:41:01.107 回答