mssql sqlserver 编写脚本时,避免死锁的方法


摘要:
死锁在sql脚本中,无法避免 ,db服务器已经拥有处理死锁的能力,在脚本运行中,db服务器会将阻塞的sql语句,在一定时间段内,自动超时掉,
这种超时机制,就是sql server处理死锁的方式。
———————————————
在sql脚本编写中,我们需要尽量编写完美,避免脚本出现死锁,下文将讲述将sql脚本死锁降至最低



1 在所有的脚本,按照统一顺序访问一系列对象

例:库存扣减中,我们所有模式的库存扣减,都采用
update A
update B
update C
update D
….
这样的顺序操作对象,避免出现互相锁定的模式,导致资源互相竞争而产生死锁



2 避免事务执行中,等待用户输入之类的操作,而出现对象被锁定的现象

例:
在后台代码中
begin tran
update A …
然后等待用户输入变量值
那么此时A表已经被锁定,而会阻塞其它操作A的事件,增加了死锁的几率。



3 从业务角度和系统设计的角度,将事务脚本缩短,避免过长锁定对象

如果一个事务脚本需要执行超长时间,那么在脚本执行期间,脚本中涉及的对象都会被死锁,此时我们应该考虑事务代码是否合理,
通过修改事务代码,来达到降低死锁的几率。



4 能使用行锁,就不要使用全表锁,缩小对象的锁定范围

我们可以通过建立唯一索引,当我们update时,采用此索引,此时可以达到最小范围的锁定,使对象上非锁定的数据,可以进行相应的操作。