我对如何使用WITH (NOLOCK)
以及全文搜索感到困惑。
从SQL Server NOLOCK and joins我得到了一个重要信息,我们应该在SQL连接的每个表中使用WITH (NOLOCK)
。但是,它不适用于此查询:
SELECT *
FROM myTable AS FT_TBL WITH (NOLOCK)
FULL OUTER JOIN
FREETEXTTABLE (myTable, fieldName, 'SRI') AS KEY_TBL WITH (NOLOCK)
ON FT_TBL.id = KEY_TBL.[KEY]
错误消息是:
Msg 156,Level 15,State 1,Line 7
关键字“WITH”附近的语法不正确。
消息319,级别15,状态1,行7 关键字'with'附近的语法不正确。如果此语句是公用表表达式,xmlnamespaces子句或更改跟踪上下文子句,则必须以分号结束前一个语句。'
问题在于'AS KEY_TBL WITH(NOLOCK)',因为它没有'WITH(NOLOCK)'就可以了。我该怎么办?我希望每个类似的记录都出现在搜索结果中,尽管其他人更新了这些记录。请提前帮助和谢谢。
答案 0 :(得分:0)
FREETEXTTABLE
不支持表提示。如果您希望在整个过程中进行未提交的读取(这是NOLOCK
对单个表的实现),请在T-SQL中设置事务隔离级别:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT *
FROM myTable AS FT_TBL
FULL OUTER JOIN
FREETEXTTABLE (myTable, fieldName, 'SRI') AS KEY_TBL
ON FT_TBL.id = KEY_TBL.[KEY]
或使用IsolationLevel.ReadUncommitted
在您的客户端代码中。
但是你应该充分意识到这种后果:READ UNCOMMITTED
确实会发出更少的锁,但它可以回馈不一致的结果。如果你所追求的只是不阻塞的读取,那么探索的一个有价值的替代方法是snapshot isolation和READ_COMMITTED_SNAPSHOT
数据库选项。 NOLOCK
以及替代方案的问题被雄辩地总结为in this article。