最近碰到一件奇怪的问题,做发布订阅老是出现 死锁,查了相关资料:
并发访问是死锁产生的主要原因之一,当多个进程同时访问数据库时,如果每个进程需要获取相同的资源并且顺序不一致,那么就有可能导致死锁的发生。
个人理解:当发布的数据库某个表与别的应用在同一时间写入、读取时,同一个表只能被一个地方使用,另一个需要排队等候
即经常出现的 线程ID xxx在XXX上重试查询之前,将等待x秒
那根据优先级设置,发布订阅优先级75.00 排在后面,就需要一直排队重试,如果别的地方一直频繁读取这个表,那这条合并代理就会一直重试最后死锁
通过执行下面的脚本,可以查出来哪些地方在读取SQL server 及一些重要的信息,比如对端设备的IP地址、计算机名称,通过SQL哪个账号登录的和应用名称
SELECT
c.session_id,
c.client_net_address AS ClientIPAddress,
s.host_name AS ClientHostName,
s.login_name AS LoginName,
s.program_name AS ApplicationName
FROM
sys.dm_exec_connections AS c
INNER JOIN
sys.dm_exec_sessions AS s
ON
c.session_id = s.session_id;
如下图标红处
查询脚本.sql |
|