T-SQL 是否有从事务开始时读取行的机制?
Does T-SQL have a mechanism for reading rows as of beginning of transaction?
我一直找不到解决这个问题的文档,而且我尝试了可序列化和快照隔离级别都没有用。
我有兴趣在事务中查询 table,我修改了事务中的 table,但我的查询不知道这些数据修改。
我确定我可以仔细排序并可能使用临时 tables 来完成我的功能,但如果有查询提示或隔离级别可以简化我的代码,我想使用它!
在常规 table 中,您无权访问您在当前事务中修改的行的先前版本。
如果 table 确实是常规 table,您可以 add the output
clause 到您的 update
语句来捕获以前的版本:
declare @t table(...);
update ...
set ...
output deleted.column1, ... into @t;
如果 table 是暂时的 table 通过,您 can 访问以前的版本:
declare @before_update datetime = getdate();
update ... ;
select ... from table ... for system_time as of @before_update;
请注意,考虑到 SQL 服务器的并发性质,这可能不是您想要的。如果在您的 = getdate()
和 update
之间进行另一笔交易,您的数据可能 return 有点太旧了。
我一直找不到解决这个问题的文档,而且我尝试了可序列化和快照隔离级别都没有用。
我有兴趣在事务中查询 table,我修改了事务中的 table,但我的查询不知道这些数据修改。
我确定我可以仔细排序并可能使用临时 tables 来完成我的功能,但如果有查询提示或隔离级别可以简化我的代码,我想使用它!
在常规 table 中,您无权访问您在当前事务中修改的行的先前版本。
如果 table 确实是常规 table,您可以 add the output
clause 到您的 update
语句来捕获以前的版本:
declare @t table(...);
update ...
set ...
output deleted.column1, ... into @t;
如果 table 是暂时的 table 通过,您 can 访问以前的版本:
declare @before_update datetime = getdate();
update ... ;
select ... from table ... for system_time as of @before_update;
请注意,考虑到 SQL 服务器的并发性质,这可能不是您想要的。如果在您的 = getdate()
和 update
之间进行另一笔交易,您的数据可能 return 有点太旧了。