我应该总是需要使用带有SESSION范围变量的cflock吗?

时间:2013-08-06 06:54:35

标签: session coldfusion locking coldfusion-9

我有一个简单的表单,在提交时在SESSION中设置一个变量,如

<cfset SESSION.shownote = 1>

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

<cfset structdelete(SESSION,"shownote")>

在这种情况下,我真的需要使用cflock吗?我不能想到这里的种族状况。

由于SESSION因用户而异,有人可以建议我确切地说我们应该将cflock与会话变量一起使用吗?

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

2 个答案:

答案 0 :(得分:4)

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

但是,无论如何,我在我的博客上写了这篇文章:“Question: when to lock scopes”。

底线是没有内在的需要来锁定会话范围(因为CFMX 6.0),但是 - 与任何代码一样 - 应该确保不在一个代码中创建竞争条件,并且合理使用锁定可以减轻这种情况。

答案 1 :(得分:1)

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

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

我将展示比赛状况。假设用户有2个浏览器窗口打开您的示例表单。两者共享同一会话,并且表单同时提交。我们将这些提交称为ONE和TWO。

处理可能会发生这种情况,这不会导致任何问题:

  1. ONE设置SESSION.shownote = 1
  2. ONE检查SESSION.shownote。它存在;发送电子邮件
  3. ONE删除SESSION.shownote。
  4. TWO设置SESSION.shownote = 1
  5. 两次检查SESSION.shownote。它存在;发送电子邮件
  6. TWO删除SESSION.shownote。
  7. 但它可能会发生这种情况,这是一个问题:

    1. ONE设置SESSION.shownote = 1
    2. TWO设置SESSION.shownote = 1
    3. ONE检查SESSION.shownote。它存在;发送电子邮件
    4. ONE删除SESSION.shownote。
    5. 两次检查SESSION.shownote。 存在; 发送电子邮件
    6. 在这种情况下,不锁定会话范围会导致意外行为。