《数据库锁机制》《模拟系统登录时卡死以简单了解数据库原理》《Oracle数据表死锁的解决方法》《深入浅出SQL Server中的死锁》《怎么捕获和记录SQL Server中发生的死锁》《SqlServer 并发事务:死锁跟踪(一)简单测试》《SqlServer 并发事务:死锁跟踪(二)确定死锁锁定的资源》《SqlServer 并发事务:死锁跟踪(三)6种跟踪死锁的方法总结》
说明
在多线程/多进程的程序中并发操作数据库,如果对数据库的运行原理理解的不深入,编写的代码没有考虑数据库运行原理的话,就很有可能导致死锁的发生,那么就需要赶紧解决问题,而我最近也遇到了一个SQL Server死锁的问题,所以趁此机会研究一下死锁的排查方法
SQL Server死锁时候报错的信息一般是:事务(进程 ID 54)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。
那么应该怎么排查?最好的方法当然是先定位到导致死锁的两条SQL,然后再去相关的程序源码中找到相应的SQL、检查对应的代码逻辑,分析并发情况下死锁的原因,然后破坏死锁产生的条件来解决死锁问题
上面的相关博客中有多种方法,这里先整理出一个简单、有效的方法:利用服务器端跟踪。其消耗小,在最繁忙的系统中也可使用。其他的方法会在日后慢慢研究和整理补充
模拟SQL Server死锁
参考《数据库锁机制》,创建数据库、创建表、模拟200万条记录
然后分别在SQL Server Management Studio打开两个会话,分别执行下面的两条语句以模拟死锁
–会话一 begin tran select * from testLock..test(holdlock); –holdlock意思是加共享锁,直到事务结束才释放 update testLock..test set name = \\\’joker\\\’; commit; –会话二 begin tran select * from testLock..test(holdlock); update testLock..test set name = \\\’xumeng\\\’; commit;
更多关于云服务器,域名注册,虚拟主机的问题,请访问垦派科技官网:www.kenpai.com