阻塞形成的原因
为什么会发生阻塞:
SQL Server是高并发数据库也就是同一时间点会有很多用户来操作和访问数据库。
为了保持数据的一致性和数据安全,SQL Server数据库引入了锁的机制。
同一时间点只有拿到钥匙的用户才能对数据进行访问和控制,其他用户则需要等待,这就是阻塞的场景
我们的目标:
减少阻塞,理顺资源请求,从而最大化的提升性能
一个UPDATE阻塞:排它锁和共享锁不兼容
SQL
USE MyData
GO
SELECT * FROM TestTable
BEGIN TRAN
UPDATE TestTable SET Col = '我比狗困'
SQL
SELECT * FROM TestTable
死锁的形成及解决方式
什么是死锁:
好比十字路口很多车辆想同时通过,如果没有维持秩序就会拥堵,谁也没法通过
死锁形成条件:
- 互斥条件:一个资源每次只能被一个进程使用
- 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
- 不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺
- 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系
死锁的检测:
- 使用Trace跟踪死锁信息(SQL Server2000以前可以采用
- Profiler捕捉死锁信息
- 扩展事件跟踪死锁
处理死锁:
- SQL Server层面处理死锁
- 在程序层面处理