我这做的是一个定时服务 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'