知方可补不足~用SqlProfiler来监视数据库死锁

简介:

关于锁的相关知识,大家可以看我的这篇文章《知方可补不足~Sqlserver中的几把锁和.net中的事务级别

死锁我想大家都知道,当一个对话(线程)占用一个资源时,别一个线程也同时去访问它,并且其中一个优化级高的对话将SQL锁状态提升为X锁(排它锁)后,其一个对话将会被作为“牺牲品”抛弃,这种现象在SQLSERVER中就叫做死锁,引起死锁的原因有很多,一般在网上被前人总结为四点

1、互斥使用(资源独占) 
 一个资源每次只能给一个进程使用 
2、不可强占(不可剥夺) 
    资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放 
3、请求和保持(部分分配,占有申请) 
一个进程在申请新的资源的同时保持对原有资源的占有(只有这样才是动态申请,动态分配) 
4、循环等待 
存在一个进程等待队列     {P1 , P2 , … , Pn},     其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路

观察锁的发生,使用sqlProfiler工具

设置对话(线程,spid)的优先级

SET TRANSACTION ISOLATION LEVEL Read Committed
BEGIN TRAN
SET DEADLOCK_PRIORITY HIGH

对于优先级,以以下选项

 LOW | NORMAL | HIGH

也可以直接使用数字

<numeric-priority> ::= { -10 | -9 | -8 | …| 0 | …| 8 | 9 | 10 }

在EF里,对发生死锁的代码进行重新提交

在EF架构里,仓储大叔提倡大家使用自己的SaveChanges方法,其原因就是可以对提交动作进行统一的控制,在里面加日志,加捕捉,加策略可以成为可能,呵呵。

 //下面代码节选自大叔的DbContextRepository类
  catch (EntityException ex)//EF配置异常,这个异常可以忽略(The underlying provider failed on Commit.)
            {
                if (Logger != null)
                    Logger(ex.Message);
                throw new Exception(ex.Message);//EntityException
            }
            catch (Exception ex)//捕获所有异常
            {

                if (Logger != null)//如果没有定义日志功能,就把异常抛出来吧
                    Logger(ex.Message + "处理时间:" + DateTime.Now);
                if (ex.GetBaseException() != null
                    && ex.GetBaseException().GetType() == typeof(System.Data.SqlClient.SqlException))
                {
                    //SqlException异常,再重新进行提交
                    Db.SaveChanges();
                }
                throw new Exception(ex.Message);
            }
本文转自博客园张占岭(仓储大叔)的博客,原文链接:知方可补不足~用SqlProfiler来监视数据库死锁,如需转载请自行联系原博主。
目录
相关文章
|
SQL 存储 Oracle
数据库系列课程(20)-数据库死锁的原因及解决方案
数据库系列课程(20)-数据库死锁的原因及解决方案
175 0
|
3月前
|
SQL 关系型数据库 MySQL
遇到mysql数据库死锁,你会怎么排查?
遇到mysql数据库死锁,你会怎么排查?
250 0
|
16天前
|
算法 安全 数据库
数据库死锁的解决方案有哪些?
【10月更文挑战第28天】数据库死锁是数据库管理中的一个常见问题
45 15
|
16天前
|
数据库连接 数据库 数据库管理
如何避免数据库死锁?
【10月更文挑战第28天】
39 14
|
23天前
|
关系型数据库 MySQL 数据库
一个 MySQL 数据库死锁的案例和解决方案
本文介绍了一个 MySQL 数据库死锁的案例和解决方案。
39 3
|
1月前
|
SQL 数据库
达梦数据库阻塞死锁及解锁
【10月更文挑战第6天】本文介绍了在达梦数据库中模拟和解决死锁的方法。首先通过创建表并插入数据但不提交事务,模拟了阻塞情况;接着利用V$TRXWAIT和V$SESSIONS视图查询阻塞信息,并通过SP_CLOSE_SESSION函数解决阻塞。最后讨论了死锁的成因及避免策略,强调了正确管理事务的重要性。
|
3月前
|
Oracle 关系型数据库 MySQL
Mysql和Oracle数据库死锁查看以及解决
【8月更文挑战第11天】本文介绍了解决MySQL与Oracle数据库死锁的方法。MySQL可通过`SHOW ENGINE INNODB STATUS`查看死锁详情,并自动回滚一个事务解除死锁;也可手动KILL事务。Oracle则通过查询V$LOCK与V$SESSION视图定位死锁,并用`ALTER SYSTEM KILL SESSION`命令终止相关会话。预防措施包括遵循ACID原则、优化索引及拆分大型事务。
129 3
|
4月前
|
Oracle 关系型数据库 数据库
关系型数据库Oracle死锁
【7月更文挑战第16天】
70 3
|
5月前
|
SQL 存储 监控
达梦数据库死锁排查与解决
达梦数据库死锁排查与解决
1474 0
|
安全 数据库
数据库死锁讲解
数据库死锁讲解
108 0