2012-07-04 29 views
3

几个问题dm_exec_sessions。当我运行查询了解SQL Server中的sys.dm_exec_sessions

select * from sys.dm_exec_sessions 

它让我看到其他列的statustransaction_isolation_level之列。

据我的理解,sys.dm_exec_sessions每个认证会话返回一行。根据我的理解,可以使用此会话运行几个查询/事务。

  1. 每个会话返回的transaction_isolation_level是什么意思?它是使用该连接在数据库上运行的最后一个事务的隔离级别吗?

  2. 有一些(几个)会话具有睡眠状态。那是什么意思?我们应该为此担心吗?来自Web服务器的这些事务是否无法回滚?

+1

这属于对数据库管理员SE。标记为迁移。 – 2012-07-04 20:07:01

回答

4

在我的理解几个查询/交易可以使用这个 会话中运行。

这是不正确的。您将始终能够执行至多一个查询,并且在一个会话中最多只有一个用户活动事务,而不会超过一个。

A 连接可以有多个会话,但这是一个不同的故事。 sys.dm_exec_connections

如果您发现SERIALIZABLE会和你想知道为什么的话,记得using new TransactionScope() Is Considered Harmful

+1

是的。我们确实有一些可序列化的事务,但其中大部分都是读取提交的。感谢您澄清连接vs会话。如果每个查询*创建会话*,那么状态为“睡眠”的会话意味着查询已发出,会话仍在等待结果? – user275157

+1

不是每个查询都会创建一个会话。会话在连接登录时创建。会话会一个接一个地运行多个请求['sys.dm_exec_requests'](http://msdn.microsoft.com/zh-cn/library/ms177648.aspx)和一个请求由语句组成,其中一些语句是查询。正在休眠的会话意味着它没有当前的请求。考虑你的客户端代码,当你打开一个连接,然后你发出一个命令,然后是另一个命令。在两个命令之间,连接的会话是空闲的,即。 *睡眠*。 –

+0

明白了。如果有许多睡眠连接在同一个sessionid中持续几天,这意味着打开的连接没有正确关闭? – user275157

1

会话本身有一个transaction_isolation_level。并且在该会话中运行的批处理/请求将使用该transaction_isolation_level,除非它明确地更改它。

Sleeping的状态仅表示会话空闲且当前没有运行批处理/请求。 (I.E.,它正在等待它的客户端连接发送一条命令来执行)。通常不需要担心什么。

的sys.dm_exec_sessions的官方文档是在这里:http://msdn.microsoft.com/en-us/library/ms176013.aspx

+0

感谢您澄清。我在结果中看到,我们的Web服务器与isolation_level serializable(4)建立了两个连接,另一个连接使用了Read committed(2)。这是一样的为什么呢?它是否应该一直使用4或2? – user275157

+1

这取决于为Web服务器编写代码的人。连接和会话可以根据需要设置或更改此设置。 – RBarryYoung