当前位置: 代码迷 >> Sql Server >> 怎么解决死锁有关问题
  详细解决方案

怎么解决死锁有关问题

热度:76   发布时间:2016-04-24 09:52:18.0
如何解决死锁问题?
我这做的是一个定时服务 A ,每分钟查询并更新Mail表。
有另一个服务 B 也是实时更新Mail,并执行发邮件,服务B在读取数据时,在存储过程中使用了事务和锁:WITH (TABLOCKX, HOLDLOCK)。
那么当服务 A 在运行的时候,Update操作经常遇到 B 服务也在锁定表,导致报出死锁错误。

我想在A服务Update的时候,判断所更新的表是否被锁定,如果被锁定则放弃更新。

请问 A服务在Update的时候,如何判断Mail表是否被B服务锁定?

B服务的存储过程我不能动,还有没有其他解决方案?
------解决思路----------------------
把B服务改成rowlock,A服务加上参数readpast
------解决思路----------------------
-- 判断是否有表锁
SELECT Count(*)
   --  ,db.name, o.name, l.rsc_type, l.req_mode, l.req_spid
  FROM sys.syslockinfo l
  JOIN sys.databases db
    ON l.rsc_dbid = db.database_id
  JOIN sys.objects o
    ON l.rsc_objid = o.object_id
 WHERE l.rsc_type = 5 -- 表
   AND l.req_mode = 5 -- 排他
   AND l.req_spid <> @@SPID --不是自己
   AND db.name = @database_name
   AND o.name = 'Mail'
  相关解决方案