Добрый день. Есть необходимость организовать продление времени жизни токенов, лежащей в одной таблице, если оставшееся время жизни меньше определённого минимума. При чём, запросы на продления могут приходить практически одновременно в разных сессиях. По сути, нужно выполнить запрос такого вида:
UPDATE tokens
SET timeout = dateadd(hh, 2, timeout)
WHERE id = <ID>
AND timeout < dateadd(hh, 1, sysdatetime())
AND timeout > sysdatetime()
но только так, чтобы запись обновилась в самой первой сессии, а в других, которые запустили запрос почти одновременно с первой, вообще ничего не делали (и не блокировались).
Ранее такую же задачу решал в oracle и PostgreSQL, там для этого используется select ... for update skip locked. Как правильно подобная задача решается в mssql?
Я так понимаю, что один из вариантов - выставить уровень изоляции read uncommited и сразу выполнять commit. Но оптимально ли такое решение (учитывая то, что для запросов будет использоваться сессии из пула подключений и теоретически есть риск попадения сессии с этим уровнем изоляции обратно в пул из-за ошибки)?