【问题标题】:Should I always need to use cflock with SESSION scope variables?我是否总是需要将 cflock 与 SESSION 范围变量一起使用?
【发布时间】:2013-08-06 06:54:34
【问题描述】:

我有一个简单的 Form ,它在提交时会在 SESSION 中设置一个变量,例如

<cfset SESSION.shownote = 1>

在向用户发送确认电子邮件后,我只是从会话中删除此变量。

<cfset structdelete(SESSION,"shownote")>

在这种情况下我真的需要用户 cflock 吗?我想不出这里的比赛条件。

由于 SESSION 因用户而异,任何人都可以确切地建议我在哪种情况下我们应该将 cflock 与会话变量一起使用?

我也听说,CF9 和 CF10 自动处理会话锁定,是真的吗?

【问题讨论】:

  • 与您的问题无关,但此会话变量是否用于任何用途?
  • 不,我只是举了一个例子供参考

标签: session coldfusion locking coldfusion-9


【解决方案1】:

我想,稍微用谷歌搜索一下可能会让你在这里回答你自己的问题。

但是,无论如何,我不久前在我的博客上写了这个:“Question: when to lock scopes”。

底线是没有内在需要锁定会话范围(从 CFMX 6.0 开始),但是 - 与任何代码一样 - 应该确保不在自己的代码中创建竞争条件,并且明智地使用锁定可以缓解这种情况。

【讨论】:

  • “没有内在需要锁定会话范围”这是否记录在 CF 9 或 10 中的某处?
  • 来吧,伙计,做一些你自己的工作。 “coldfusion session scope”的第一个谷歌结果是讨论它的官方文档的链接。
  • 在这里否决了您的答案。强烈建议对任何写操作使用锁定,因为任何事情都可能最终处于某种意外状态。 Adobe 有关于整个锁定和死锁的章节是有原因的。人们往往会忽略这些“微不足道的事情”并搞砸大事,即使只是“那一个案例”。
  • Adam,这是cflock session variables 的#2 结果:help.adobe.com/en_US/ColdFusion/9.0/Developing/…,其中明确指出“重要提示:始终将访问会话变量的代码放入 cflock 标记中。”顺便说一句,这个问题现在是谷歌排名第一的问题。谷歌搜索结果一直在变化,不同的文档有不同的说法。事实上,最高结果与您的断言相矛盾。我意识到这是一年后的旧版本 CF,但仍然如此。
  • @AdamCameron 抱歉。我的意思不是很清楚。我不是在争论你是否需要使用锁。相反,在这种情况下,谷歌不一定会提供一个快速而直接的答案。你断言如果迪帕克“做了他自己的工作”,他会发现谷歌的第一次点击以直接的方式解决了这个问题,显然它没有。虽然我同意期待人们为您使用 Google 有点烦人,但我个人觉得当人们了解其他人的情况时会更烦人。 [耸肩]
【解决方案2】:

如果您的应用程序需要检查是否存在 SESSION.shownote 或 SESSION.shownote 的值,那么您有竞争条件,应该使用 cflock。

虽然您的示例没有包含任何此类检查,但可能开发人员没有无缘无故地设置变量。假设您的表单处理脚本检查是否存在 SESSION.shownote,如果该条件为真,有条件地发送一封确认电子邮件。

我将演示竞态条件。假设用户有 2 个浏览器窗口打开您的示例表单。两者共享同一个会话,并且表单同时提交。我们将这些提交的内容称为 ONE 和 2。

处理可能会像这样发生,这不会导致任何问题:

  1. 一组 SESSION.shownote = 1
  2. ONE 检查 SESSION.shownote。它存在;发送电子邮件
  3. ONE 删除 SESSION.shownote。
  4. 两组 SESSION.shownote = 1
  5. 对 SESSION.shownote 进行两次检查。它存在;发送电子邮件
  6. 两次删除 SESSION.shownote。

但它可能会发生这样的事情,这是一个问题:

  1. 一组 SESSION.shownote = 1
  2. 两组 SESSION.shownote = 1
  3. ONE 检查 SESSION.shownote。它存在;发送电子邮件
  4. ONE 删除 SESSION.shownote。
  5. 对 SESSION.shownote 进行两次检查。它确实存在; 发送电子邮件

在这种情况下,不锁定会话范围会导致意外行为。

【讨论】:

  • 所以这意味着当我们在 .cfm 中声明/修改某些会话变量的值时,我们需要始终使用 cflock?
猜你喜欢
  • 2020-04-24
  • 2021-09-20
  • 1970-01-01
  • 2018-11-26
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
相关资源
最近更新 更多