我遇到类似于此处描述的问题:
How do I force a refresh of a fulltext index within a transaction in 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,只要事务处于挂起状态,select就不会返回任何行。一旦我提交,填充状态返回0并且select按预期返回单行。
我错过了什么吗?还有另一种方法来实现这一目标吗?在不同版本的SQL Server下,此行为是否不同? (我目前正在使用2008测试)
答案 0 :(得分:1)
我觉得你运气不好。尝试在事务中启动手动刷新...
begin tran
alter fulltext index on dbo.FTS_Table start full population
...给我这条消息:
Msg 574,Level 16,State 0,Line 1 ALTER FULLTEXT INDEX声明 不能在用户事务中使用。
您可能有哪些替代方案可能取决于您如何管理单元测试,也许您可以再次DELETE
数据,或者如果表仅用于此测试则完全DROP
表。
答案 1 :(得分:0)
基本上,SQL Server不允许您在事务(或快照)中执行某些操作。
索引服务特别故意在用户连接外部运行,因为存在争用风险和巨大的文本索引限制。
如果您退一步考虑其他任何数据库连接的影响,并考虑当前的一个事务重写全文索引,我相信您会明白,在这种情况下,Microsoft有一个点。