我的查询或多或少如下:
select node from NODES node
inner join SIGNATURES signature on node.NODE_ID=signature.NODE_ID and (... some non-important, AND separated restrictions on signature fields)
left outer join OTHERS other on signature.ID=other.SIGNATURE_ID
where node.DISABLED=0 and (some non-important, AND separated restrictions on node fields);
NODES与SIGNATURES的关系为1..n,而SIGNATURES与其他人的关系为1..n
问题是,我在一些奇怪的情况下被告知尚未识别的极端情况,此查询在生产中返回包含将DISABLED字段设置为1的节点的结果。这怎么可能?
答案 0 :(得分:2)
您没有显示完整的查询。 WHERE子句可能包含AND和OR的混合,您只是忘记了合适的括号。
示例:where node.DISABLED=0 AND blabla OR thisnthat AND somestuff
答案 1 :(得分:1)
可能发生的一种方法是脏读。在生产环境中,有人可以在您的查询选择记录后更改记录的DISABLED值。此行为通过隔离级别进行控制,以便快速查看
http://msdn.microsoft.com/en-us/vstudio/ms709374%28v=vs.103%29.aspx
或许多博主的许多出色的解释。
隔离级别通常在数据库级别设置,但至少在T-SQL中,您可以使用提示在查询中请求它。请参阅READCOMMITTED,REPEATABLEREAD等 http://msdn.microsoft.com/en-us/library/ms187373.aspx
您可能希望在帖子中添加隔离级别,这有助于进一步完善答案。