标签归档:死锁

mssql sqlserver select查询会锁表,会使update delete超时


摘要:
下文讲述sqlserver大查询时,无法使用update delete操作的处理方法,如下所示:
实验环境:sql server 2008 R2



我们深知当对数据表执行select操作时,会产生share锁,当数据被共享锁时,其它事务只可对数据读取,无法对数据进行修改操作,
此时对高频更新的数据,则会产生相当大的影响。

当我们对数据的实时性要求不是很高时,我们可以显式的指定select查询时,不对表进行锁定,此举可以避免selectda大查询时,影响其它update delete操作,具体方法如下:

   ---在表后面加上nolock关键字,可使用无锁的方式查询数据库
   select * from tableName with(nolock)
   ---或
   select * from  tableName (nolock)

mssql sqlserver 查看死锁相关信息


摘要:
在业务系统中,由于很多未确定的因素产生,可能会”或多或少”的产生死锁现象,下文将从死锁的原因分析死锁,并给出相关的死锁避免脚本,如下所示:
实验环境:sqlserver 2008 R2



sqlserver产生死锁的原因:

1.系统各种资源不足,导致死锁
2.各种对象的调用,产生互相死锁

sqlserver产生死锁的必要条件:

1.一个资源被一个进程引用时,此时另一个进程无法使用,此时另一个进程就会处于等待状态
2.当前进程A所请求的资源被另一个进程B占用,而进程B所需使用的资源此时正被进程A占用
3.进程所需的资源无法从别地进程中释放出来
4.进程所需的资源无限等待状态

mssql sqlserver 使用sql脚本查看表死锁的方法分享


摘要:
下文讲述使用sql脚本获取表死锁的方法分享,如下所示:
实验环境:sql server 2008 R2


 
----方法1:使用sys.dm_tran_locks 系统表获取死锁进程Id 及 所对应的表名 
SELECT  request_session_id as [进程Id] ,
        OBJECT_NAME(resource_associated_entity_id)  as [表名]
FROM    sys.dm_tran_locks
WHERE   resource_type = 'OBJECT'
  
----方法2: 使用存储过程获取死锁表的方法分享

create proc   sp_lock_search
AS 
    BEGIN     
        DECLARE @spid INT     
        DECLARE @blk INT     
        DECLARE @count INT     
        DECLARE @index INT     
        DECLARE @lock TINYINT      
        SET @lock = 0      
        CREATE TABLE #tmp_lock_info
            (
              id INT IDENTITY(1, 1) ,
              spid INT ,
              blk INT
            )      
        IF @@error <> 0 
            RETURN @@error      
        INSERT  INTO #tmp_lock_info
                ( spid ,
                  blk
                )
                SELECT  0 ,
                        blocked
                FROM    ( SELECT    *
                          FROM      master..sysprocesses
                          WHERE     blocked > 0
                        ) a
                WHERE   NOT EXISTS ( SELECT *
                                     FROM   master..sysprocesses
                                     WHERE  a.blocked = spid
                                            AND blocked > 0 )
                UNION
                SELECT  spid ,
                        blocked
                FROM    master..sysprocesses
                WHERE   blocked > 0      
        IF @@error <> 0 
            RETURN @@error      
        SELECT  @count = COUNT(*) ,
                @index = 1
        FROM    #temp_who_lock      
        IF @@error <> 0 
            RETURN @@error      
        IF @count = 0 
            BEGIN     
                SELECT  '无死锁及阻塞'     
                RETURN 0      
            END     
        WHILE @index <= @count 
            BEGIN     
                IF EXISTS ( SELECT  1
                            FROM    #tmp_lock_info a
                            WHERE   id > @index
                                    AND EXISTS ( SELECT 1
                                                 FROM   #tmp_lock_info
                                                 WHERE  id <= @index
                                                        AND a.blk = spid ) ) 
                    BEGIN     
                        SET @lock = 1      
                        SELECT  @spid = spid ,
                                @blk = blk
                        FROM    #tmp_lock_info
                        WHERE   id = @index     
                        SELECT  '死锁进程Id: ' + CAST(@spid AS VARCHAR(88)) 
                       --- DBCC inputbuffer(@spid)      --死锁进程Id
                        ---DBCC inputbuffer(@blk)        --阻塞进程Id
                    END     
                SET @index = @index + 1      
            END     
        IF @lock = 0 
            BEGIN     
                SET @index = 1      
                WHILE @index <= @count 
                    BEGIN     
                        SELECT  @spid = spid ,
                                @blk = blk
                        FROM    #tmp_lock_info
                        WHERE   id = @index     
                        IF @spid = 0 
                            SELECT  '阻塞Id:' + CAST(@blk AS VARCHAR(88)) 
                        ELSE 
                            SELECT  '进程ID:' + CAST(@spid AS VARCHAR(88))
                                    + '被' + '进程号SPID:'
                                    + CAST(@blk AS VARCHAR(10))
                                    + '阻塞'     
                          --- DBCC inputbuffer(@spid)      --死锁进程Id
                        ---DBCC inputbuffer(@blk)        --阻塞进程Id    
                        SET @index = @index + 1      
                    END     
            END     
        DROP TABLE #tmp_lock_info      
        RETURN 0      
    END           
GO


exec sp_lock_search 
go