1

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

<cfset SESSION.shownote = 1>

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

<cfset structdelete(SESSION,"shownote")>

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

由于 SESSION 因用户而异,任何人都可以建议我在哪种情况下我们应该使用带有会话变量的 cflock 吗?

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

4

2 回答 2

4

我想,有点谷歌搜索可能会让你在这里回答你自己的问题。

但是,无论如何,我不久前在我的博客上写了这个:“问题:何时锁定范围”。

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

于 2013-08-06T07:16:10.627 回答
3

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

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

我将演示比赛条件。假设用户有 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 进行两次检查。它不存在;不发送电子邮件

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

于 2014-07-28T14:05:49.747 回答