博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EF中查询出现死锁的处理
阅读量:7071 次
发布时间:2019-06-28

本文共 1486 字,大约阅读时间需要 4 分钟。

在EF执行数据库查询时,如果查询语句中,有连接查询语句时,就会产生对表进行锁定,如果此时对锁定的表再次加锁操作(delete ,insert)就会死锁。

检查的方法:

1、查询出现死锁的记录

2、分析记录来对EF语句进行调整

 

一、下面来说一下怎样来查询死锁相关的表(SQL Profiler)【此部分参考:】

 

一个方便直观的方法就是使用SQL Server Profiler来查看死锁,本篇主要讲解这种方法,具体步骤如下:

步骤1:打开SQL Server Profiler

通过”Microsoft SQL Server Management Studio->Tools->SQL Server Profiler“运行SQL Server Profiler

步骤2:打开之后按照如下图所示,设置trace properties的General标签页上的属性

 

步骤3:按照右图所示,设置Events Selection,设置完之后点击“Run”按钮开始跟踪事件。

步骤4:等待死锁发生,查看事件信息,找到Deadlock Graph查看死锁,如右图所示。

 

按照如下步骤可以产生死锁:

1.在SQL Server management studio中,打开一查询,输入如下语句:

1: BEGINTRANSACTION
2: 
3: update AdventureWorks.Person.Address
4: 
5: set AddressLine1=AddressLine1+'a'
6: 
7: where AddressID=1
8: 
9: waitfor delay'00:00:10'
10: 
11: update AdventureWorks.Person.Address
12: 
13: set AddressLine1=AddressLine1+'b'
14: 
15: where AddressID=2

2.在SQL Server management studio中,打开一个新的查询,输入如下语句:

1: BEGIN TRANSACTION
2: 
3: update AdventureWorks.Person.Address
4: 
5: set AddressLine1=AddressLine1+'b'
6: 
7: where AddressID=2
8: 
9: waitfor delay'00:00:10'
10: 
11: update AdventureWorks.Person.Address
12: 
13: set AddressLine1=AddressLine1+'a'
14: 
15: where AddressID=1
16: 

 

3.执行1和2中的SQL语句,稍等片刻就会有一个事务被选作牺牲者。

4.在非牺牲者的查询中执行Rollback语句以回滚事务

 

二、对EF语句进行调整

一般情况下,我们认为查询语句不会对表进行锁定,在连接查询时,会对表进行锁定,如果连接主表选择的不好也会出现锁定争用的问题,就会出现死锁。

现在我们来分析一下,一种出现死锁的情况:

表结构图如下:

 

查询公司数据,以Company为主表进行连接查询,语句如下:

 

如果在查询同时,也有对user表进行删除或新增的操作,就会造成,下面的死锁:

 

 

只要修改语句如下,就可以避免死锁:

转载于:https://www.cnblogs.com/LifelongLearning/archive/2011/09/21/2183735.html

你可能感兴趣的文章
NSNotificationCenter
查看>>
oneproxy-for-sqlserver的配置方法
查看>>
QPID spring 示例
查看>>
自动优化mycncart和opencart所有数据库
查看>>
快速充电技术介绍
查看>>
Laravel4 入门一
查看>>
shell学习链接
查看>>
TiDB 源码阅读系列文章(十三)索引范围计算简介
查看>>
新入行程序员应知的十个秘密
查看>>
linux下MySQL表名忽略大小写设置
查看>>
MySQL DATE_FORMAT() 函数
查看>>
适配多种数据结构和ui的万能适配器
查看>>
Spring Boot自定义Starter模块开发
查看>>
java.net.NoRouteToHostException: No route to host
查看>>
有限维度的向量空间
查看>>
java thirteen线程同步机制
查看>>
微信小程序教程、微信小程序开发资源下载汇总(6.16日更新,持续更新中……)...
查看>>
CentOS 6.3 安装Mysql 整理
查看>>
电脑中安装多个版本的JDK后的切换
查看>>
Docker入门与实战系列:生态系统
查看>>