我有一个 IIS 模块,可同时处理多个请求。在每个请求的入口处,我想记录上次访问该服务的时间:
update log set last_access = getdate()
但是,由于有时我会拥有的并发级别,我担心很容易发生冲突。
因为我的日志不需要毫秒的精度(它将被查阅以检查服务器在过去 X 分钟内是否被访问过,而不是毫秒),所以如果我的日志遇到冲突,它可以完全忽略该日志而不执行任何操作。
我最初的想法是在 try-catch 块内保护我的日志记录并忽略冲突。
begin try
update log set last_access = getdate()
end try
begin catch
-- We do nothing and ignore that another request has logged an access at the same time
end catch
但这是正确的吗?如果发生冲突,将自动跳转到 catch 部分,不执行任何操作,因此我的后端可以继续正常处理其余请求?
我担心它可能会等待死锁解除,然后在超时后继续。有没有更好的方法来更新值,同时告诉 SQL Server 如果另一个会话已经同时执行了该更新,则忽略该更新?
PS:此更新日志将在其自己的事务中运行,而服务请求所需的任何 SQL 操作都将在单独的事务中运行。
谢谢。