使用 SQL Server Management Studio,打开查询窗口并执行
BEGIN TRAN
在另一个窗口执行
select [text],
from sys.sysprocesses
cross apply sys.dm_exec_sql_text(sql_handle)
where status = 'sleeping'
and open_tran = 1
我懂了select @@trancount
这是怎么回事?谁在计算交易?这是管理工作室的事情吗?
使用 SQL Server Management Studio,打开查询窗口并执行
BEGIN TRAN
在另一个窗口执行
select [text],
from sys.sysprocesses
cross apply sys.dm_exec_sql_text(sql_handle)
where status = 'sleeping'
and open_tran = 1
我懂了select @@trancount
这是怎么回事?谁在计算交易?这是管理工作室的事情吗?
这是一个 SQL Server Management Studio 的东西。至少 SSMS 版本 13.0.15500.91。此版本的 SSMS 将使用与查询窗口相同的连接代表您计算打开的事务数。
我是这样发现的
SELECT @@TRANCOUNT
BEGIN TRAN
SELECT @@TRANCOUNT
在每次执行后执行。SELECT SERVERPROPERTY('EngineEdition') AS DatabaseEngineEdition
在每次执行之前执行。BEGIN TRAN
原来是一个红鲱鱼位。无论在查询窗口中执行什么,SSMS 2016 都会执行这些额外的查询......即使您的批处理只是空白。我不认为这是 Management Studio 的事情——我以前在其他应用程序中看到过这种情况,但没有亲自在 SSMS 中看到过。话虽如此,如果 SSMS 在某些情况下做这样的事情,我不会感到惊讶。
如果您从 sys.sysprocesses 中获取更多列,您可能能够追踪到谁在计算事务 - 特别是,如果它是 SSMS 查询窗口(即您所做的事情),或者 SSMS 自己做的事情:
该
BEGIN TRAN
语句增加@@trancount
和open_tran
计数器 - 但直到你做“东西”它实际上并不持有任何锁,导致任何阻塞,或阻止事务日志重用。因此,我已经停止使用 open_tran 列作为担心的理由。相反,我在以下位置查看特定的事务状态sys.dm_database_transactions
:您可以使用
database_transaction_state
和 其他列来获取更多有用的信息,以决定您是否需要担心它。[编辑]:看起来这是 SSMS 2016 的新功能:如果我使用 SSMS 2014,我看不到您描述的行为,但是当我使用 SSMS 2016 时,我看到了这种行为。看起来 SSMS 2016
select @@trancount
在您运行BEGIN TRAN
或查询窗口中的任何查询后隐式执行。Profiler/Extended Events 确认有一个 Batch Started/CompletedBEGIN TRAN
或其他,紧随其后的是第二个 Batch Started/Completedselect @@trancount
。诡异的。@@trancount
是每个会话,因此如果您在BEGIN TRAN
窗口中运行它,您会看到值 1。您看到的
sleeping
是第一个会话的条目,因为它实际上并没有做任何事情。事务已打开,但未完成任何工作。如果你打开一个事务,做了一堆工作(已经完成)但从未真正关闭事务,那将是同样的事情。好的,我想我现在更好地理解了你的问题。
BEGIN TRAN
我第一次运行您的查询时看到了一个,然后我尝试SELECT @@trancount
在第一个会话中运行。当我回到第二次会议时,我看到了SELECT @@trancount
你所做的那样。它将向您展示在第一个会话中运行的最后一件事。