SQL Azure - 一个会话锁定整个数据库以进行更新和插入

时间:2013-04-03 13:32:47

标签: sql sql-server azure-sql-database

SQL Azure问题。

我的问题在我们的(asp.net)网站上显示为以下异常:

  

超时已过期。完成之前已经过了超时时间   操作或服务器没有响应。声明一直如此   终止。

它还会导致更新和插入语句永远不会在SMSS中完成。查询时不存在任何X或IX锁:sys.dm_tran_locks并且在查询sys.dm_tran_active_transactionssys.dm_tran_database_transactions时没有任何交易。

数据库中的每个表都存在问题,但同一实例上的其他数据库不会导致问题。问题的持续时间可以是2分钟到2小时,并且不会在一天中的任何特定时间发生。

数据库未满。

此问题有时无法自行解决,但我能够通过查询sys.dm_exec_connections查找运行时间最长的会话,然后将其删除来解决此问题。奇怪的是,连接时间为15分钟,但锁定问题已经存在超过3个小时。

还有什么我可以检查吗?

修改

根据保罗在下面的回答。在他回答之前,我实际上已经找到了问题。我会在下面发布我用来解决这个问题的步骤,以防他们帮助其他人。

当存在“超时期限”时,运行以下查询。

select *  from sys.dm_exec_requests

Request Stats

正如我们所看到的,所有WAIT请求都在等待会话1021,即复制请求! TM Request表示DTC事务,我们不使用分布式事务。您还可以看到SE_REPL_COMMIT_ACK的wait_type,这再次暗示了复制。

select * from  sys.dm_tran_locks

enter image description here

再次等待1021会议

SELECT * FROM sys.dm_db_wait_stats ORDER BY wait_time_ms desc

enter image description here

是的,SE_REPL_CATCHUP_THROTTLE的总等待时间为8094034 ms,即134.9分钟!!!

有关此问题的详细信息,请参阅以下论坛。 http://social.technet.microsoft.com/Forums/en-US/ssdsgetstarted/thread/c3003a28-8beb-4860-85b2-03cf6d0312a8

  

在与我的沟通中,我得到了以下答案   微软(我们在欧盟的15个数据库中有4个看过这个问题   数据中心):

     

问题:这些软件是否有变化?   过去三周的节流限制,即我的问题   开始了吗?

     

答案:不,没有。

     

问题:我们有办法吗?   防止或被警告我们正在接近极限?

     

答案:不是。问题   可能不是由您的申请引起的,但可能是由其他人引起的   租户依赖相同的物理硬件。换句话说,你的   应用程序可以承受很小的负载,但仍会遇到问题。   换句话说,您自己的流量可能是导致此问题的原因,但是   它也可以由依赖于它的其他租户引起   物理硬件。事先没有办法知道这个问题   很快就会发生 - 它可以随时发生而不会发出警告。 SQL   Azure运营团队不会监控此类错误,因此他们也是如此   不会自动尝试为您解决问题。所以,如果你跑   你有两个选择:

     
      
  1. 创建数据库的副本并使用它,并希望将数据库放置在负载较小的另一台服务器上。

  2.   
  3. 联系Windows Azure支持并告知问题并让他们为您执行选项1

  4.   

1 个答案:

答案 0 :(得分:9)

您可能遇到了目前困扰很多人使用Sql Azure(包括我的公司)的SE_REPL *问题。

当您遇到超时时,请尝试检查等待类型的等待请求:

  • SE_REPL_SLOW_SECONDARY_THROTTLE
  • SE_REPL_COMMIT_ACK

运行以下命令检查当前连接上的等待类型:

SELECT TOP 10 r.session_id, r.plan_handle,
r.sql_handle, r.request_id,
r.start_time, r.status,
r.command, r.database_id,
r.user_id, r.wait_type,
r.wait_time, r.last_wait_type,
r.wait_resource, r.total_elapsed_time,
r.cpu_time, r.transaction_isolation_level,
r.row_count
FROM sys.dm_exec_requests r

您还可以通过运行以下方式检查此类别的历史记录:

SELECT * FROM sys.dm_db_wait_stats
ORDER BY wait_time_ms desc

如果您看到很多SE_REPL *等待类型并且这些类型在您的连接上保持设置任何时间长度,那么基本上您已经搞砸了。 微软已经意识到了这个问题,但我现在已经开通了一个星期的支持票,他们现在仍然在努力。

当Sql Azure复制从属落后时,会发生SE_REPL *等待。 基本上整个db在复制赶上时挂起查询:/

因此,实质上使Sql Azure高度可用的方面导致数据库变得随机不可用。 如果没有杀死我们,我会嘲笑讽刺。

详细了解此主题: http://social.technet.microsoft.com/Forums/en-US/ssdsgetstarted/thread/c3003a28-8beb-4860-85b2-03cf6d0312a8