提交事务之前查询数据


10

我的理解是,在MS SQL Server Management Studio窗口中,执行“开始事务”然后进行一些更改(如将数据添加到表中)之后,您只能从同一窗口查询该表和那些更改,直到执行“提交交易”。

在执行“提交事务”之前,有什么方法可以从另一个来源进行查询吗?

具体到我当前的目标并添加一些上下文。我从Excel Power Query进行一些SQL查询。我真的很想能够在“提交事务”之前执行这些查询,以便我可以进行一些分析并弄清楚是否应该执行回滚而不是提交。

Answers:


14

是的,如果更改查询已修改数据的会话的事务隔离级别(在SSMS中称为“窗口”),则是可能的。通常这不是一个好主意,因为您可能会得到一些意想不到的结果。仔细考虑副作用。我不知道是否可以在Excel Power Query中更改事务隔离级别。

例如,以下查询集将插入一些数据并正确显示更新,即使没有提交/回滚也是如此。

-- Session 1
begin tran tx_test;
-- Assume the Test table exists and insert is okay
insert dbo.Test(datadate, content) values (getdate(), 'transaction');
select * from Test; -- Shows the new data
-- After select, one would execute one of the following
-- commit;
-- rollback;

同时,第二个会话执行的选择似乎没有任何作用:

-- Session 2
-- This waits for uncommitted transaction
-- and returns results after 1st session commits/rollbacks
select * from Test;

创建第三个会话并更改其隔离级别:

-- Session 3
set transaction isolation level read uncommitted;
-- This reads the inserted data from the 1st session, even before commit
select * from Test;

这一切都说得通!我需要尝试一下,然后将其标记为答案。谢谢。
亚历克斯(Alex)

3

作为最佳实践,事务应保持尽可能短,并且不要等待用户交互;每次在事务中执行某种类型的数据或架构修改时,都会在已触摸/修改的对象或行上放置锁,从而使其他用户的查询处于等待状态。这反过来会产生连锁效应,使您的数据库服务器陷入停顿。

在您描述的场景中,我建议您制作一份数据副本以分隔“假设分析”表,您可以在其中进行修改并查看结果。对结果满意后,请使用事务将该表的数据合并回原始表。


听起来像个好建议。@vonPryz的回答只是想要我现在需要的。我确实认为您的建议应该是我接下来要讨论的内容。
亚历克斯(Alex)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.