我正在尝试将时间限制的信号量放入sql数据库中。在写入数据表时,锁将提供互斥,但只涉及某个FK值(电子邮件),这就是我不能使用表锁或类似的原因。而且,由于我不相信sql连接在任何情况下都会被保存或释放(当然,我们尝试过了,但比抱歉安全得多),所以如果锁之间没有更新或释放,则锁将在3分钟后超时。
到目前为止,我有以下SQL语句:
UPDATE users SET lockTime = GETDATE() OUTPUT DELETED.LockTime WHERE email = @mail问题是:如果用户在表中,这将总是更新lockTime并返回旧的lockTime。因此,如果孤立锁生效,并且查询每隔2分钟运行一次,则锁将永远不会释放。(对于测试围绕它的所有逻辑来说,这是可以的,但对于生产来说就不行了。)
只有当lockTime大于3分钟时才应该更新它。所以我试着:
UPDATE users SET lockTime = GETDATE() OUTPUT DELETED.LockTime
WHERE email = @mail AND DATEADD(lockTime,'3 minutes')<GETDATE()但是这甚至不能被放入测试代码中,因为我无法区分“电子邮件不在DB”和“锁小于3分钟”的情况。
我哪里想错了?
发布于 2015-01-30 15:54:48
这样做会更好吗:
UPDATE users
SET lockTime =
CASE WHEN DATEADD(lockTime,'3 minutes')<GETDATE() THEN GETDATE()
ELSE lockTime END
OUTPUT DELETED.LockTime
WHERE email = @mail我们使用CASE来决定是否实际更新lockTime。
https://stackoverflow.com/questions/28239530
复制相似问题