首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server中的手动信号量

SQL Server中的手动信号量
EN

Stack Overflow用户
提问于 2015-01-30 15:45:06
回答 1查看 2.5K关注 0票数 2

我正在尝试将时间限制的信号量放入sql数据库中。在写入数据表时,锁将提供互斥,但只涉及某个FK值(电子邮件),这就是我不能使用表锁或类似的原因。而且,由于我不相信sql连接在任何情况下都会被保存或释放(当然,我们尝试过了,但比抱歉安全得多),所以如果锁之间没有更新或释放,则锁将在3分钟后超时。

到目前为止,我有以下SQL语句:

代码语言:javascript
复制
UPDATE users SET lockTime = GETDATE() OUTPUT DELETED.LockTime WHERE email = @mail

问题是:如果用户在表中,这将总是更新lockTime并返回旧的lockTime。因此,如果孤立锁生效,并且查询每隔2分钟运行一次,则锁将永远不会释放。(对于测试围绕它的所有逻辑来说,这是可以的,但对于生产来说就不行了。)

只有当lockTime大于3分钟时才应该更新它。所以我试着:

代码语言:javascript
复制
UPDATE users SET lockTime = GETDATE() OUTPUT DELETED.LockTime 
WHERE email = @mail AND DATEADD(lockTime,'3 minutes')<GETDATE()

但是这甚至不能被放入测试代码中,因为我无法区分“电子邮件不在DB”和“锁小于3分钟”的情况。

我哪里想错了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-30 15:54:48

这样做会更好吗:

代码语言:javascript
复制
UPDATE users
SET lockTime = 
CASE WHEN DATEADD(lockTime,'3 minutes')<GETDATE() THEN GETDATE()
ELSE lockTime END
OUTPUT DELETED.LockTime
WHERE email = @mail

我们使用CASE来决定是否实际更新lockTime

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28239530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档