【问题标题】:SQL Server: Avoid simultaneous updates increasing a column value over its targetSQL Server:避免同时更新增加列值超过其目标
【发布时间】:2015-07-14 21:27:24
【问题描述】:

我有一个名为 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 视图 - 可能会发生这种情况

  1. 两个或更多用户在他们的 3-choice-menu 中有相同的广告
  2. 两个或更多用户同时观看同一个广告

1 和 2 本身不是问题,但如果广告距离设置的最大值只有一次点击,则可能会出现问题。

我认为解决此问题的一种方法是将活动标志设置为 false,如果广告在 3 选项菜单中显示时距离其目标只有一次点击,并且如果用户没有点击它,该标志将被重置为 true - 但随后我需要处理用户退出选项对话或断开连接、超时等情况。我觉得必须有更好的方法。

我听到的另一个建议是,当广告被召唤到 3 选项菜单时自动增加计数器,但这比其他的开销更大,并且会遇到同样的问题。

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

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

【问题讨论】:

  • 广告展示次数比购买次数多几倍真的如此重要吗?虽然最有可能保证确切的视图数量,但实施起来可能相当困难。粗略地说,你有多少同时用户,总共有多少广告?换句话说,同一个广告同时展示给 1、2、3、4 等用户的几率有多大?
  • 如果您使用活动标志,那么您是说只有在活动标志为假时才能将其显示为选项?这是否意味着对于任何广告,它只显示给一个用户?更一般地说,您应该在找到解决方案之前明确要求。特别是,您是否希望将广告作为选项同时显示给多个用户。例如,如果广告还有 100 次观看,您是否希望将其作为选项显示给 5 位用户?
  • 首先,明确需求。有很多选择:
  • 似乎没有办法避免广告选项选择在某些时候变得无效的可能性。您可以施加固定的时间限制,或者如果广告浏览量达到其限制,您可以说它变得无效。然后决定如果广告选项变得无效该怎么办。可能无法避免让用户点击无效的广告,但您可以通过从前端删除它来避免这种情况发生。对于无效广告,您可以让用户通过或再次显示选项。一旦你澄清我会提出一个解决方案。
  • 这是个好问题。你见过我的cmets吗?

标签: sql sql-server database stored-procedures


【解决方案1】:

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

但是,要回答你的问题:也许你可以处理这个“模糊”。不是大腿 active=yes/no,而是像 InactivityLevel 和超时一样的东西。

只要你的标志是真的,一切都很好。如果计数器超出,您切换到“没有新访问者”并设置时间戳,因此您的添加不会显示在新的上下文中。在给定超时后,您将其设置为“非活动”。

【讨论】:

  • 正确计算视图的真实表是另一个表,该表仅具有这些值以便更快地查询。我考虑了时间戳,但随后我需要有一个流程来不断检查在目标的一次视图中被禁用的广告,并且从未计算过最后一次视图并重新启用它们。我的意思是,总而言之,它不会产生太大影响,所以也许我应该这样做。
  • 因为您永远无法确定谁是您的最后一位访客以及他何时会终止会话,这可能是必要的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多