zoukankan      html  css  js  c++  java
  • EF中查询出现死锁的处理

    在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

    image

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

     image

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

    image


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

    image

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

    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语句进行调整

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

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

    表结构图如下:

    image

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

    image

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

    image

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

    image

  • 相关阅读:
    基于JavaFXWJFXGameEngine游戏引擎介绍与进度
    进程线程与cpu绑定
    [Vim练级攻略] Vim基础操作
    hdu 2159 fate
    python的httplib注意事项
    SQL优化总结
    项目整体开发流程以及配置人员
    hdu 1010 解题报告 Tempter of the Bone
    在centos搭建git服务器时,不小心把/home/git目录删除了,我是怎么恢复的
    int 和bigint差别有多大?
  • 原文地址:https://www.cnblogs.com/LifelongLearning/p/2183735.html
Copyright © 2011-2022 走看看