数据库死锁分析

数据库死锁分析

ID:44421425

大小:87.54 KB

页数:5页

时间:2019-10-21

数据库死锁分析_第1页
数据库死锁分析_第2页
数据库死锁分析_第3页
数据库死锁分析_第4页
数据库死锁分析_第5页
资源描述:

《数据库死锁分析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、目录1.对数据库设计的要求2.对数据库开发的要求3.对运行维护的要求4.数据库开发中各种死锁剖析4」类型一:爭务中SQL语句先后顺序不当造成死锁4.2类型二:Sybase数据库采用锁模式不当造成死锁4.3类型三:DML语句影响行数过多造成死锁数据库死锁死锁是指在某组资源屮,两个或两个以上的线程在执行过程屮,在争夺某一资源时而造成互相等待的现象,若无外力的作用卞,它们都将无法推进下去,死时就可能会产牛死锁,这些永远在互相等待的进程称为死锁线程。简单地说,进程A等待进程B释放他的资源,B又等待A释放他的资源

2、,这样互相等待就形成死锁。死锁在高并发环境中产牛。1・对数据库设计的要求《数据库设计规范》修订内容:【原则3-13]数据库设计时对数据库测试必须进行要求。说明:包括功能测试(即对方案中各条目的测试)要求和性能测试要求。大表(由总体设计确定),必须进行大数据量测试,必要吋进行大话务屋测试;执行频率高的存储过程(由总体设计确定),必须进行执行效率测试;操作频繁的表(由总体设计确定),必须在并发环境下,测试性能和验证是否会造成死锁。2.对数据库开发的要求《数据库设计规范》修订内容:【规则8-17】操作频繁的表

3、,必须采用行锁。说明:操作频繁的表(由总体设计确定),必须采用行锁。针对Sybase数据库。【规则9-2】sql块和存储过程中使用事务,两个锁Z间的语句执行吋间越短越好。说明:时间越短,死锁发牛•的可能性越低,系统并发能力越高。如果事务执行时间过长,容易引起数据库效率低,产生阻塞,甚至产生死锁。有会两种方法:在保证正确的前提下,事务越小越好;控制dml语句影响行数,行数越少越好。【规则9-11]sql块和存储过程屮使用事务,必须以相同的顺序对资源加锁。说明:根据业务特点,将用到的表按照主次排序,在事务中

4、,按照先主后次的顺序操作。【建议9-12]sql块和存储过程屮使用事务,优先对排他性最高的资源加锁。说明:优先对排他性较高的资源加锁,冇利于提高系统并发性能。2.对运行维护的要求出现死锁后,数据库牺牲引起死锁的最早的爭•务,自动解开死锁。定期的检查数据库日志,看日志是否报“deadlock”错。3.数据库开发中各种死锁剖析4.1类型一:事务中sql语句先后顺序不当造成死锁•说明代码中事务控制逻辑不当,引起死锁。•举例2009年02月16日,海外某局点Sybase数据库报告死锁。04:00000:0023

5、1:2009/02/1607:16:37.80serverDeadlockId40detectedDeadlockId40:Process(Familyid0,Spid64,Suid3)wasexecutingaUPDATEcommandatline1.SQLText:updatetb_userlevelsetusedl/cense=usedl/cense-1whereusertype=@pO?DeadlockId40:Process(Familyid0,Spid231,Suid3)wasexecuti

6、ngaUPDATEcommandatlineLSQLText:updatelbuserlevelsetusedliccnse=usedlicense-1whereuscrtype=@pO?DeadlockId40:Process(FamilyidftSpid231)waswaitingfora"exclusiverow"lockonrow4page552209ofthe'tb_userlevel"tableindatabase9butprocess(Familyid0,Spid64)alreadyhel

7、da'exclusiverow"lockonit.DeadlockId40:Process(Familyid0,Spid64)waswaitingfora"exclusiverow9lockonrow6page552209ofthe'lbuserlevel9tabicindatabase9butprocess(Familyid0,Spid231)alreadyhelda"exclusiverow"lockonit.DeadlockId40:Process(Familyid0,Spid64)waschos

8、enasthevictim.互锁的sql都是执行同一个update,即将tb_userlevel表某个等级的license减1,在代码中只有一•个地方使用,即用八修改了自己的等级吋更新新、旧等级的已使用license,具体代码逻辑是这样的(一•个事务里):1、将新等级的license加1;2、将原等级的1icense减];当A用户由等级2—》等级1,而此时正好有B用户由等级1一》等级2时,上述代码实际就是这样的事务sql:用户A:begin

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。