死锁

死锁

0
投票
0
回答
1766
浏览

关于死锁问题,在ETL过程中

niggling 发起了问题 • 2015-10-27 21:48
0
推荐
2384
浏览

处理死锁 阻塞问题预备知识之SELECT,UPDATE,DELETE操作需要申请的锁(一 SELECT操作)

--常见SELECT操作要申请的锁 --查看当前数据库的版本信息: print @@version/*Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)   Jul  9 2008 14:43:34   C...

TravyLee 发表了文章 • 2015-10-06 22:51

0
推荐
2034
浏览

处理死锁 阻塞问题预备知识之SELECT,UPDATE,DELETE操作需要申请的锁(二 UPDATE操作)

--处理死锁 阻塞问题预备知识之SELECT,UPDATE,DELETE操作需要申请的锁(二 UPDATE操作)对于update语句,可以简单地理解为SQL Server先做查询,把需要修改的数据找到后再在这个记录上做修改。查询动作需要加S锁(共享...

TravyLee 发表了文章 • 2015-10-06 22:50

0
推荐
2200
浏览

造成阻塞和死锁的3大原因:

1、session连接持有锁时间过长2、锁数目过多3、锁粒度过大

桦仔 发表了文章 • 2015-10-03 23:15

0
推荐
2239
浏览

SQLSERVER中的锁资源类型RID KEY PAG EXT TAB DB FIL

在检测死锁的时候,会用到sp_lock这个存储过程,里面有一列:type 即锁的资源类型通俗来讲就是SQLSERVER可以在哪些资源上加锁可以加锁的资源有RID KEY PAG EXT TAB DB FIL ,下面一一道来以下是对不同种类的资源...

桦仔 发表了文章 • 2015-10-03 23:11

0
推荐
2163
浏览

数据库的读读事务也会产生死锁

前段时间有朋友问:SQL Server的AlwaysOn的辅助数据库默认会使用行版本快照控制来消除数据库上的读写事务阻塞和死锁问题即使用户显式为查询设置了其他事务隔离级别,所有锁提示(Lock Hint)都会被忽略。为了保证...

桦仔 发表了文章 • 2015-09-28 21:44

0
推荐
2532
浏览

记一次公司仓库服务器死锁过程

仓库拣货卡死,排查了数据库的很多地方,都没有头绪,最后到SQL Server 错误日志里查看,终于发现了蛛丝马迹EXEC xp_readerrorlog 0,1,NULL,NULL,'2015-09-21','2015-10-10','DESC' waiter id=process5c30e08...

桦仔 发表了文章 • 2015-09-27 18:04

0
投票
1
已解决
4326
浏览
条新动态, 点击查看
死锁(deadlock)是一种特殊的阻塞情况——两个对话互相阻塞。每个对话在保留自己的资源的同时,试图访问其他对话锁定的资源。这将导致一种循环阻塞的情境,也被称为抱死(deadly embrace)。
当两个进程试图在相同的资源上升级其锁机制时死锁也频繁出现。... 显示全部 »
死锁(deadlock)是一种特殊的阻塞情况——两个对话互相阻塞。每个对话在保留自己的资源的同时,试图访问其他对话锁定的资源。这将导致一种循环阻塞的情境,也被称为抱死(deadly embrace)。
当两个进程试图在相同的资源上升级其锁机制时死锁也频繁出现。
SQL Server有一个死锁侦测进程,称为锁监视器(lock monitor),定期检查SQL Server中死锁的存在。一旦侦测到死锁条件,选择涉及死锁的一个会话作为受害者以打断循环阻塞。这个过程包括撤销受害者进程保留的所有资源,通过回滚被选为受害者的会话的未提交事务来做到这一点。
SQL Server通过评估撤销参与会话的事务的代价来确定作为死锁受害者的会话,并选择代价最小的一个。
SET DEADLOCK_PRIORITY LOW
SET DEADLOCK_PRIORITY NORMAL --默认设置

当SQL Server选择一个会话作为受害者时,它发起一个带有错误号的错误。SQL Server使用TRY/CATCH结构来处理错误。SQL SEerver自动回滚受害者会话的事务来保证数据库的一致性。这个回滚确保会话回到事务开始前的相同状态。
TRY/CATCH方式捕捉错误,使用ERROR_NUMBER()函数检查错误号是否有死锁。一旦确定了死锁,可以尝试重启事务设定的次数。

收集死锁信息:
通过Profiler工具使用特殊的跟踪事件,设置跟踪标志1222和1204:
跟踪标志1222提供了关于死锁最详细的信息,将收集到的信息写入到死锁事件发生的服务器上的日志文件中,按照自愿和进程排序信息,并提高更多的信息。
跟踪标志1204提供帮助分析死锁起因的详细信息,它按照死锁涉及的节点排序这些信息。
DBCC TRACEON语句用于打开(或启用)跟踪标志。使用DECC TRACEOFF语句禁用它,使用DBCC TRACESTATUS语句确定跟踪标志的状态。
启用:
DBCC TRACEON (1222,-1)
DBCC TRACEON (1204,-1)
禁用:
DBCC TRACEOFF (1222,-1)
DBCC TRACEOFF (1204,-1)
查询状态:
DBCC TRACESTATUS
分析死锁:
操作步骤:
1. 在SSMS界面中使用DBCC TRACEON设置跟踪标志;
2. 打开SQL Profiler,选择Locks:Deadlock graph事件跟踪死锁;
3. 在TextData字段显示死锁XML信息,并在下方显示死锁图表;

避免死锁
 按照相同的时间顺序访问资源
 减少锁
 最小化锁争用

按照相同的时间顺序访问资源:
最常用的是确保每个事务按照相同的物理顺序访问资源。
减少被访问资源的数量:
使用SQL Server特性:
 将非聚集索引转换为聚集索引
因为非聚集索引的叶子页面与堆或聚集索引的数据页面分离,因此需要两个锁:一个用于基本表(聚集或堆),另一个用于非聚集索引。而聚集索引的叶子页面等于表的数据页面,因此只需要一个锁。和非聚集索引相比,减少了同一个查询访问的资源数量。
 为SELECT语句使用覆盖索引
覆盖索引类似表的“复制”机制,SELECT语句可以通过覆盖索引获得需要的数据,而不再另外访问基本表。这样基本表可以被其他会话锁定。
最小化锁的争用:
可以通过避免在一个争用的资源上请求锁资源来解决死锁问题。修改资源始终需要一个资源上的(X)锁来维护资源的一致性。因此在死锁的情况下,如果可能,确定只读的资源访问,并使用脏读特性避免对应的锁请求。
 实现行版本控制
代替使用严格的锁架构来避免访问资源,可以通过已提交读快照或快照隔离级别来实施行版本控制。行版本控制隔离级别用于减少阻塞,但是由于是在tempdb中增加了一个可用的行版本,从而增加了tempdb的开销,尤其是tempdb空间不足的情况下。
ALTER DATABASE zhongyang
SET READ_COMMITTED_SNAPSHOT ON
 降低隔离级别
将包含SELECT语句的事务隔离级别降低为未提交读,这样SELECT语句就可以不请求(S)锁而读取数据,从而避免循环阻塞。但是如果需要依赖读取的数据进行进一步操作,那么这个方法就不可取。
 使用锁提示
 NOLOCK
 READUNCOMMITTED
避免给定会话请求(S)锁,作用于查询级别并且限于所应用到的表(及其索引),只允许用于SELECT语句中以及INSERT、DELETE、UPDATE语句的数据选择部分中。
最小化锁争用带来的脏读的副作用,只有在脏读可接受的情况下,才能使用这种技术。
0
投票
0
回答
1766
浏览

关于死锁问题,在ETL过程中

niggling 发起了问题 • 2015-10-27 21:48
0
投票
1
已解决
4326
浏览
0
推荐
2384
浏览

处理死锁 阻塞问题预备知识之SELECT,UPDATE,DELETE操作需要申请的锁(一 SELECT操作)

--常见SELECT操作要申请的锁 --查看当前数据库的版本信息: print @@version/*Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)   Jul  9 2008 14:43:34   C...

TravyLee 发表了文章 • 2015-10-06 22:51

0
推荐
2034
浏览

处理死锁 阻塞问题预备知识之SELECT,UPDATE,DELETE操作需要申请的锁(二 UPDATE操作)

--处理死锁 阻塞问题预备知识之SELECT,UPDATE,DELETE操作需要申请的锁(二 UPDATE操作)对于update语句,可以简单地理解为SQL Server先做查询,把需要修改的数据找到后再在这个记录上做修改。查询动作需要加S锁(共享...

TravyLee 发表了文章 • 2015-10-06 22:50

0
推荐
2200
浏览

造成阻塞和死锁的3大原因:

1、session连接持有锁时间过长2、锁数目过多3、锁粒度过大

桦仔 发表了文章 • 2015-10-03 23:15

0
推荐
2239
浏览

SQLSERVER中的锁资源类型RID KEY PAG EXT TAB DB FIL

在检测死锁的时候,会用到sp_lock这个存储过程,里面有一列:type 即锁的资源类型通俗来讲就是SQLSERVER可以在哪些资源上加锁可以加锁的资源有RID KEY PAG EXT TAB DB FIL ,下面一一道来以下是对不同种类的资源...

桦仔 发表了文章 • 2015-10-03 23:11

0
推荐
2163
浏览

数据库的读读事务也会产生死锁

前段时间有朋友问:SQL Server的AlwaysOn的辅助数据库默认会使用行版本快照控制来消除数据库上的读写事务阻塞和死锁问题即使用户显式为查询设置了其他事务隔离级别,所有锁提示(Lock Hint)都会被忽略。为了保证...

桦仔 发表了文章 • 2015-09-28 21:44

0
推荐
2532
浏览

记一次公司仓库服务器死锁过程

仓库拣货卡死,排查了数据库的很多地方,都没有头绪,最后到SQL Server 错误日志里查看,终于发现了蛛丝马迹EXEC xp_readerrorlog 0,1,NULL,NULL,'2015-09-21','2015-10-10','DESC' waiter id=process5c30e08...

桦仔 发表了文章 • 2015-09-27 18:04