首页 > 数据库 >SQL Server 死锁处理和优化心得

SQL Server 死锁处理和优化心得

时间:2024-01-23 13:05:33浏览次数:37  
标签:00 dbo zping Server 死锁 SQL where select

    前段时间提到的"SQL Server 2005 死锁解决探索",死锁严重,平均每天会发生一次死锁,在解决和处理SQL server2005死锁中查了很多资料和想了很多办法, 对为何出现死锁和怎样较少死锁有了进一步认识,在这里和大家一起分享:  

   SQL Server 锁类型

     在数据库中主要存在两种锁: S(共享锁)和X(排他锁)

     S(共享锁):在执行查询数据时,SQL server会将行锁定,这时只能查询数据,删,改被阻塞,

     X(排他锁):在插入和删除数据时,将行锁定,这时增,删,改都被阻塞

      以上两种锁都会引起死锁:

死锁定义:在两个或多个任务中,如果每个任务锁定了其他任务试图锁定的资源,此时会造成这些任务永久阻塞,从而出现死锁

 

   这里模拟一下死锁环境:

     建立环境:

SQL Server 死锁处理和优化心得_隔离级别

----死锁例子,建立表数据

SQL Server 死锁处理和优化心得_隔离级别

create table  [dbo].[[zping.com1]]]( 

SQL Server 死锁处理和优化心得_隔离级别

A varchar(2) 

SQL Server 死锁处理和优化心得_隔离级别

,B varchar(2) 

SQL Server 死锁处理和优化心得_隔离级别

,C varchar(2)) 

SQL Server 死锁处理和优化心得_隔离级别


SQL Server 死锁处理和优化心得_隔离级别

--插入数据 

SQL Server 死锁处理和优化心得_隔离级别

insert into  [dbo].[[zping.com1]]] 

SQL Server 死锁处理和优化心得_隔离级别

select 'a1','b1','c1' 

SQL Server 死锁处理和优化心得_隔离级别

union all select 'a2','b2','c2' 

SQL Server 死锁处理和优化心得_隔离级别

union all select 'a3','b3','c3' 

SQL Server 死锁处理和优化心得_隔离级别


SQL Server 死锁处理和优化心得_隔离级别

--建立表数据

SQL Server 死锁处理和优化心得_隔离级别

create table  [dbo].[[zping.com2]]] 

SQL Server 死锁处理和优化心得_隔离级别

(D varchar(2) 

SQL Server 死锁处理和优化心得_隔离级别

,E varchar(2)) 

SQL Server 死锁处理和优化心得_隔离级别


SQL Server 死锁处理和优化心得_隔离级别

 --插入数据 

SQL Server 死锁处理和优化心得_隔离级别

insert into  [dbo].[[zping.com2]]] 

SQL Server 死锁处理和优化心得_隔离级别

select 'd1','e1' 

SQL Server 死锁处理和优化心得_隔离级别

union all select 'd2','e2' 

SQL Server 死锁处理和优化心得_隔离级别

 

    1. 1  排他锁引起的死锁

     执行语句:

SQL Server 死锁处理和优化心得_隔离级别

begin tran 

SQL Server 死锁处理和优化心得_隔离级别

update   [dbo].[[zping.com2]]] 

SQL Server 死锁处理和优化心得_隔离级别

set D='d5' 

SQL Server 死锁处理和优化心得_隔离级别

where E='e1' 

SQL Server 死锁处理和优化心得_隔离级别

waitfor delay '00:00:05' 

SQL Server 死锁处理和优化心得_隔离级别


SQL Server 死锁处理和优化心得_隔离级别

update   [dbo].[[zping.com1]]] 

SQL Server 死锁处理和优化心得_隔离级别

set A='aa' 

SQL Server 死锁处理和优化心得_隔离级别

where B='b2' 

 

SQL Server 死锁处理和优化心得_隔离级别

begin tran 

SQL Server 死锁处理和优化心得_隔离级别

update   [dbo].[[zping.com1]]] 

SQL Server 死锁处理和优化心得_隔离级别

set A='aa' 

SQL Server 死锁处理和优化心得_隔离级别

where B='b2' 

SQL Server 死锁处理和优化心得_隔离级别

waitfor delay '00:00:05' 

SQL Server 死锁处理和优化心得_隔离级别


SQL Server 死锁处理和优化心得_隔离级别

update   [dbo].[[zping.com2]]] 

SQL Server 死锁处理和优化心得_隔离级别

set D='d5' 

SQL Server 死锁处理和优化心得_隔离级别

where E='e1' 

(结束后记住要把事务回滚啊)

    1.2   共享锁引起的死锁 

SQL Server 死锁处理和优化心得_隔离级别

begin tran 

SQL Server 死锁处理和优化心得_隔离级别

update   [dbo].[[zping.com2]]] 

SQL Server 死锁处理和优化心得_隔离级别

set D='d5' 

SQL Server 死锁处理和优化心得_隔离级别

where E='e1' 

SQL Server 死锁处理和优化心得_隔离级别

waitfor delay '00:00:05' 

SQL Server 死锁处理和优化心得_隔离级别


SQL Server 死锁处理和优化心得_隔离级别

select * from [dbo].[[zping.com1]]] 

SQL Server 死锁处理和优化心得_隔离级别

where B='b2' 

 

SQL Server 死锁处理和优化心得_隔离级别

begin tran 

SQL Server 死锁处理和优化心得_隔离级别

update   [dbo].[[zping.com1]]] 

SQL Server 死锁处理和优化心得_隔离级别

set A='aa' 

SQL Server 死锁处理和优化心得_隔离级别

where B='b2' 

SQL Server 死锁处理和优化心得_隔离级别

waitfor delay '00:00:05'  

SQL Server 死锁处理和优化心得_隔离级别


SQL Server 死锁处理和优化心得_隔离级别

select * from [dbo].[[zping.com2]]] 

SQL Server 死锁处理和优化心得_隔离级别

where E='e1'

(结束后记住要把事务回滚啊)

     知道死锁产生的原因,在生产环境产生的死锁就类似这两种情况。

    后来在网上查阅了很多资料,包括sql server 2005的帮助文档。总结有以下有主要几点:

     1,降低隔离级别或者使用行版本控制隔离级别

     2,提高数据的访问速度

     3,减少事务长度

     4,将按顺序访问热点表(如将访问频繁的表放在最后访问)

 

   遇到的困难

   但在我们这次优化中,有些是不太好处理的 如:

是由业务逻辑来决定的(来自tom的《Oracle 9i/10g深入内部体系机构》中)

2,按顺序访问热点表,我们发现代码中方法间互相调用很频繁,经常一个表调用多次,要修改表的访问顺序是比较困难的。

 

   采用的方法

   后来我们就使用了以下方法:

(没有了共享锁死锁)    

(减少了锁定时间)   

     3,水平拆分表(分区)并在程序读写时尽量做到分区消除,减少读写的行数,降低锁定升级的频率和时间。 (减少锁的升级)

 

   通过4个月左右的运行,系统就发生过一次死锁,比以前大大降低。



标签:00,dbo,zping,Server,死锁,SQL,where,select
From: https://blog.51cto.com/u_16532032/9376970

相关文章

  • mysql分析sql语句基础工具 -- explain
    分析sql语句explainexplain(sql语句)G;分析结果:idsql语句编号如果是连接查询,表之间是平等关系,编号相同;如果有子查询,编号递增。select——type查询类型table查询针对的表 该值可能是实际的表名或者临时表,derived表示form子查询,null表示无须查表possible_key可能用到的索引ke......
  • MySQL 8.0 的xtrabackup备份
     xtrabackup备份语句:   fname=`date+%F_%H-%M-%S`mkdir-p/mnt/dbbak/db_$fnamextrabackup--defaults-file=/etc/my.cnf-uhyb-phd-h/var/lib/mysql-S/var/lib/mysql/mysql.sock-Hlocalhost--port=3306--backup--parallel=4--target-dir=/mnt/dbbak/db_$f......
  • mysql之my.cnf详解
    值,如果该值为0,则默认值为max_binlog_size(1G);如果不为0,则max_relay_log_size则为最大的relay_log文件大小;relay-log-purge=1#是否自动清空不再需要中继日志时。默认值为1(启用)expire_logs_days=30#超过30天的binlog删除binlog_cache_size=1M#在一个事务中......
  • 随Linux开机自动启动mysql
    在MySQL的管理过程中,会遇到PCServer脱机或者重启,我需要在主机启动后再将MySQL服务启动。如果上百台或者更多的MySQL主机进行维护时,可能会有多台主机出现类似问题,要是每次都手动操作,是很繁琐的事情。我们可以采用随系统一起启动MySQL服务,这样就解决了频繁手动启动MySQL的问题。要实......
  • mysql_safe和mysql_multi
    1mysql_safe原理mysqld_safe其实为一个shell脚本(封装mysqld),启动时需要调用server和database(即/bin和/data目录),因此需要满足下述条件之一:1/bin和/data和mysql_safe脚本位于同一目录;2如果本地目录找不到找到/bin和/data,mysqld_safe试图通过绝对路径定位(/usr/local);shell>......
  • mysqlslap压测
    mysqlslap是MySQL自带的压测工具:time./mysqlslap--no-defaults-usa-pcc.123-P18601--create-schema=test-S/tmp/mysql_sandbox18601.sock--number-of-queries=1000000--concurrency=10--query="select*fromtbwherea='1';" 上面: mysqlslap压测......
  • MySQL事件自动kill运行时间超时的SQL
    delimiter$createeventmy_long_running_trx_monitoronscheduleevery1minutestarts'2015-09-1511:00:00'oncompletionpreserveenabledobegindeclarev_sqlvarchar(500);declareno_more_long_running_trxintegerdefault0;declarec_......
  • MySQL数据库开发规范-EC
    最近一段时间一边在线上抓取SQL来优化,一边在整理这个开发规范,尽量减少新的问题SQL进入生产库。今天也是对公司的开发做了一次培训,PPT就不放上来了,里面有十来个生产SQL的案例。因为规范大部分还是具有通用性,所以也借鉴了像去哪儿和赶集的规范,但实际在撰写本文的过程中,每一条规范的背......
  • MySQL线程状态详解
    前言:我们常用showprocesslist或showfullprocesslist查看数据库连接状态,其中比较关注的是State列,此列表示该连接此刻所在的状态。那么你真的了解不同State值所表示的状态吗?下面我们参考官方文档来一探究竟。以MySQL5.7版本为例官方文档地址:https://dev.my......
  • MySQL学习总结 (InnoDB)
    主要内容:存储结构索引锁事务存储结构表索引组织表:表是根据主键顺序组织存放的。如果表中没有非空惟一索引,引擎会自动创建一个6字节大小的指针。主键的索引是定义索引的顺序,而不是建表时列的顺序。表空间:逻辑结构的最高层,所有的数据都存放在表空间中。段:表空间由各个段组成,常见的段......