【问题标题】:How to get a mutual exclusion on select queries in SQL Server如何在 SQL Server 中的选择查询上获得互斥
【发布时间】:2016-12-22 11:10:50
【问题描述】:

我知道我可能在我的应用程序中问一些愚蠢的问题,用户可以创建某种议程,但每天只允许特定数量的议程。所以,用户执行这个伪代码:

select count(*) as created
from Agendas
where agendaDay = 'dd/mm/yyyy'

if  created < allowedAgendas {
  insert into Agendas ...
}

所有这一切显然必须在互斥的情况下执行。一次只有一个用户可以读取已创建议程的数量,如果允许,还可以插入一个新的。

我该怎么做?

我尝试使用默认的 Read Committed 隔离级别打开事务,但这无济于事,因为在事务期间,其他用户仍然可以通过选择查询同时获取创建的议程的数量,因此请尝试 插入一个新的,即使它不被允许。

我认为更改隔离级别没有帮助。

我该怎么做?

为了测试,我使用的是 SQL Server 2008,而在我们的生产服务器上运行的是 SQL Server 2012。

【问题讨论】:

    标签: sql sql-server transactions locking mutual-exclusion


    【解决方案1】:

    听起来您在那里遇到了架构问题,但您可以通过以下方式实现此要求:

    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    

    如果您在同一事务中读取插入,我看不出问题出在哪里,但如果您希望基于计数进行交互式输入,那么您可能应该确保在单个会话实现某种排队功能

    【讨论】:

    • 谢谢你哦哦哦。但是,“我有架构问题”是什么意思?我的意思是...假设允许的议程是 4,并且已经有 3 个 ceated 议程。如果两个或多个用户在没有互斥的情况下同时执行 select count(),他们将同时获得 3,因此他们都将创建一个新议程......而不是只有一个应该,而第二个,在获得锁定后,应该从 select count() 中得到 4,所以他不应该创建一个新议程......
    • 不清楚您使用的是哪个版本的sql server,但是如果给定日期有限制,我会让用户从序列中读取最新值,并控制是否限制的行为达到与否
    • 感谢您的提示...我不知道什么是序列。我将尝试使用可序列化的隔离级别...
    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多