我在SQL Server数据库上运行了这个查询:
begin transaction;
insert into [db].[a].[Table1] ( [IsDeleted], [itemId], [regionId], [deskId], [LastUpdated], [LastUpdatedby])
select [IsDeleted], [itemId], [regionId], 11, [LastUpdated], [LastUpdatedby]
from [db].[a].[Table1]
where deskId = 12;
update [db].[a].[Table1]
set deskId = 3
where deskId = 12;
commit transaction;
有些记录应该已经改变但是它说(O行受影响)。
我现在去做一个:
Select * from [db].[a].[Table1]
现在只需几分钟就可以使用“执行查询”旋转,但站点没有结束。
答案 0 :(得分:2)
第一个脚本是否仍在实际执行更新语句?如果是这样,那么当您选择尚未提交的行时,这是预期的。
如果没有并且它显然是空闲的,那么我认为你不能运行整个第一个脚本。无论如何,交易似乎仍然是开放的,需要回滚或承诺。
您可以通过运行select * from sys.dm_os_waiting_tasks
并查看blocking_session_id
来确认这一点,或者如果您使用的是SQL2000,则需要使用exec sp_who2
这是管理工作室吗?如果是这样,请转到带有insert语句的窗口(如果更新仍未进行),则根据需要运行rollback
或commit
。
如果您在SSMS中选择一些文本然后运行它将只执行所选文本。这可能解释了如何只运行部分脚本。
答案 1 :(得分:2)
如果您仍然更新第一个表,那么读取将不起作用;如果你停止查询(第一个),它将回滚,但这可能需要一些时间。
将选择更改为:
Select * from [db].[a].[Table1] WITH(NOLOCK)
它应该马上回来。
希望有所帮助