我有一个查询
UPDATE dbo.M_Room
SET
//do something
WHERE PK_RoomId= @RoomId AND IsActive=1 AND FK_DepartmentId =@DepartmentId
现在假设PK_RoomId是我的M_Room的Pk并且是自动增量字段。 所以根据这个我可以使用
WHERE PK_RoomId= @RoomId
而不是
WHERE PK_RoomId= @RoomId AND IsActive=1 AND FK_DepartmentId =@DepartmentId
如果我使用第二个条件而不是第一个条件,我可以克服的所有威胁。 如果我们没有任何关系/约束(PK,FK等),由于数据库的非托管结构,物理上存在并且无法实现。
在这种情况下,您的建议是什么? 应该做些什么来保持数据的一致性。
答案 0 :(得分:0)
我认为将WHERE
更改为WHERE PK_RoomId= @RoomId
不是一个好主意。第一部分(您要保留的部分)用于识别记录。第二部分(AND IsActive=1
)用于根据房间是否活动来限制更新。关于最后一部分(AND FK_DepartmentId =@DepartmentId
),这可能意味着有时您只想更新房间,如果它属于您指定的部门。这也很有用。
为什么要更改查询?
答案 1 :(得分:0)
如果您正在使用READ-UNCOMMITTED交易或根本没有交易,或者数据长时间位于某人的屏幕上,附加条件可以使您免于埋藏更新,假设您执行某些操作对IsActive专栏做了一些事情。
它也可能是一个最后的防范,只是出错了(看看房间是否活跃,然后忘记利用这个事实)。
确保检查两种情况下更新的行数。
你的倒数第二段表明room_id可能不是唯一的;如果是这样的话,你总会遇到麻烦。
我自己,如果我怀疑它们可能会发生,我会倾向于明确检查埋藏的更新,并且我认为防止编程错误的形式是不寻常的。