• Sleeping会话导致阻塞原理(上)


    背景

    我在处理客户问题的时候,客户经常搞不懂sleeping 的由来,和他可能导致的问题。下面来详细说下

    什么是sleeping

    其实我们经常可以在数据库中看到“”sleeping“状态的连接,但是这个sleeping 的状态是怎么来的,如果有很多sleeping状态的连接对数据库有什么影响吗?sleeping 代表建立了数据库连接,但是,程序段没有发出SQL命令. 因为很多应用程序为了减少打开和关闭连接的开销,在完成数据库中的操作后,仍然保持数据库的连接。这些连接最主要的目的是重用。举例:如果一个应用程序使用数据库连接提取数据,如果已经存在一个连接可以重用,那么建立连接的消耗当然能够最小化。那么,维护大量的sleeping连接会是一种开销吗?虽然,它相对来说是比较低的,但的确也是有开销的。如果代码编写的合适,我们不应该看到大量的sleeping连接。

    举个栗子

    新建一个控制台应用程序,先加入下面的代码

    1.建立连接并打开

    SqlConnection sqlConnection = new SqlConnection("Server=(local);Database=Mydb;UId=test;Pwd=password;");
    sqlConnection.Open();

    查看数据库会看到,此时就会出现SLEEPING状态。这就是建立了连接但是没有发出任何SQL命令

     2.SQL执行语句完成

    我们执行下面的代码 。在执行的过程中可能有(running,suspened,runnale状态)等他执行完。查看数据库中的状态变为sleeping.

    SqlCommand sqlCommand = new SqlCommand("select name from dbo.Student", sqlConnection);
    sqlCommand.ExecuteScalar();

    问题

     到目前为止,sleepig是怎么来的应该很清楚了,,但他可能到导致的问题是什么呢。具体看下面案例,

    会话77就是sleeping操作,他阻塞了会话81,81又阻塞了75.  看看等待时间,,有点不忍直视了,数学好的同学可以数一下。   

    这个问题怎么产生的呢? 其实就是在运行 sqlCommand.ExecuteScalar(); 的时候开启了事务,但是这个语句由于超时或者查询被取消了,会话变成了sleeping状态。但是事务在数据库中中还是开启的状态。

    解决

    通过查看上面图中的工具,查看77 执行的语句,定位对应到程序中的代码段,然后进行下面的改善措施:

    1.在代码中加入try catch的异常处理,在处理的的代码中加入 :IF @@TRANCOUNT > 0 ROLLBACK TRAN

    2.找到对应的执行的SQL,找出他执行超时的原因加以解决。

    3.使用 SET XACT_ABORT ON; 他表示 如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。

    作者:Owen Zeng
    如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    网站加载速度优化的14个技巧
    op+3g
    Xmind 快捷键
    Resty 一款极简的restful轻量级的web框架
    linux磁盘限额配置:quota命令
    常用报表工具
    http://mirror2.openwrt.org/sources/
    op挂载摄像头
    supported platform
    OpenWrt Kernel Module Creation Howto
  • 原文地址:https://www.cnblogs.com/OwenZeng/p/5653428.html
Copyright © 2020-2023  润新知