SQL Server:避免同时更新,使列值超过其目标值

SQL Server:避免同时更新,使列值超过其目标值,sql,sql-server,database,stored-procedures,Sql,Sql Server,Database,Stored Procedures,我有一个名为AD的SQL Server表,其中要查看的广告存储为 create table Sponsors.AD ( ADID varchar(40) primary key, SponsorID varchar(30), PurchasedViews int , --How many views the ad must reach before it is disabled CurrentViewCount int, --Keeps track of how

我有一个名为
AD
的SQL Server表,其中要查看的广告存储为

create table Sponsors.AD
(
    ADID varchar(40) primary key,
    SponsorID varchar(30),
    PurchasedViews int , --How many views the ad must reach before it is disabled
    CurrentViewCount int, --Keeps track of how many views the ad has gotten
{...}
    Active bit -- for easier checking of whether the AD still has clicks to give
)
这会进入一个网页,在该网页中,要访问某个功能,用户首先需要查看一个广告。用户可以从显示三个选项的菜单中选择一个广告[他们选择一个,广告媒体显示,功能在结束时解锁]。 他们查看广告后,其
CurrentViewCount
应更新(增加1)

这是由一个存储过程来处理的,该存储过程包括对表的更新调用(与为选项菜单随机获取3个AD的存储过程不同),但我正在寻找关于如何解决同步所有并发
AD
视图的问题的建议,因为这可能会发生

  • 两个或多个用户的三选菜单中有相同的广告
  • 两个或多个用户同时查看同一广告
  • 1和2本身不是一个问题,但如果广告距离设置的最大值仅点击一次,则可能是一个问题

    我认为解决这个问题的一种方法是,如果广告在3选项菜单中显示时离目标点击一次,则将活动标志设置为false,如果用户未点击,则标志将重置为true——但我需要处理用户退出选项对话或断开连接、超时的情况,我觉得一定有更好的办法

    我听到的另一个建议是,当广告被调到3选项菜单时,自动增加计数器,但这比另一个更高的开销,并且存在同样的问题

    锁定桌子是绝对不可行的,除非我们想一次只提供一个广告视图-所以我甚至没有考虑它


    我确信之前已经讨论过类似的内容,但不知道要搜索哪些关键字/etc来查找更多信息。

    我不会计算同一个表中的点击次数。。。可以避免您的锁定问题

    但是,为了回答你的问题:也许你可以处理这个“模糊”。不是thight active=yes/no,而是类似于不活动级别和超时


    只要你的旗帜是真的,一切都很好。如果计数器超过,则切换到“无新访问者”并设置时间戳,这样添加的内容就不会显示在新上下文中。在给定的超时后,将其设置为“非活动”

    我不会计算同一张表中的点击次数。。。可以避免您的锁定问题

    但是,为了回答你的问题:也许你可以处理这个“模糊”。不是thight active=yes/no,而是类似于不活动级别和超时


    只要你的旗帜是真的,一切都很好。如果计数器超过,则切换到“无新访问者”并设置时间戳,这样添加的内容就不会显示在新上下文中。在给定的超时后,将其设置为“非活动”

    正确计算视图的实际表是另一个表,此表仅包含这些值,以便更快地查询。我考虑了时间戳,但我需要有一个过程,不断检查在目标的一个视图中被禁用的广告,并且从未计算最后一个视图并重新启用它们。我的意思是,总的来说,它不会有太大的影响,所以也许我应该。因为你永远不知道谁是你的最后一个访问者,他什么时候会终止他的会话,这可能是必要的…正确计算视图的真实表是另一个表,这个表只有这些值,以便更快地查询。我考虑了时间戳,但我需要有一个过程,不断检查在目标的一个视图中被禁用的广告,并且从未计算最后一个视图并重新启用它们。我的意思是,总的来说,它不会有太大的影响,所以也许我应该。因为你永远不知道谁是你的最后一位访客,他什么时候会结束他的会议,这可能是必要的…广告的播放量比购买量多几倍真的很重要吗?虽然最有可能保证视图的确切数量,但实现起来可能相当困难。大致上,你同时拥有多少用户,总共有多少广告?换言之,同一广告同时呈现给1、2、3、4等用户的可能性有多大?如果您使用活动标志,那么您是说,如果活动标志为假,则只能将其显示为选项?这难道不意味着对于任何广告,它只显示给一个用户吗?更一般地说,您应该在找到解决方案之前澄清需求。特别是,您是否希望同时将广告作为选项显示给多个用户。例如,如果广告还有100个视图,您是否希望将其作为选项显示给5个用户?首先,澄清要求。有很多选择:似乎没有办法避免广告选择在某个时候失效的可能性。你可以设定一个固定的时间限制,或者如果广告浏览量达到限制,你可以说它无效。。然后决定如果广告选项无效该怎么办。可能无法避免用户点击已失效的广告,但您可以通过从前端删除它来避免这种情况的发生。对于无效广告,您可以让用户通过或再次显示选项。一旦你澄清,我将提出一个解决方案。这是一个好问题。你看到我的评论了吗?一个广告比购买的广告多出几倍真的很关键吗?虽然最有可能保证视图的确切数量,但实现起来可能相当困难。大致上,你同时拥有多少用户,总共有多少广告?换言之,同一广告同时呈现给1、2、3、4等用户的可能性有多大?如果您使用活动标志,那么您是说,如果活动标志为假,则只能将其显示为选项?这难道不意味着对于任何广告,它只显示给一个用户吗?一般来说,你应该