我有一个简单的表单,在提交时在SESSION中设置一个变量,如
<cfset SESSION.shownote = 1>
在向用户发送确认电子邮件后,我只是从会话中删除此变量。
<cfset structdelete(SESSION,"shownote")>
在这种情况下,我真的需要使用cflock吗?我不能想到这里的种族状况。
由于SESSION因用户而异,有人可以建议我确切地说我们应该将cflock与会话变量一起使用吗?
我也听说过,CF9和CF10会自动处理会话锁定,这是真的吗?
答案 0 :(得分:4)
我想,有点谷歌搜索可能让你在这里回答你自己的问题。
但是,无论如何,我在我的博客上写了这篇文章:“Question: when to lock scopes”。
底线是没有内在的需要来锁定会话范围(因为CFMX 6.0),但是 - 与任何代码一样 - 应该确保不在一个代码中创建竞争条件,并且合理使用锁定可以减轻这种情况。
答案 1 :(得分:1)
如果您的应用程序需要检查是否存在SESSION.shownote或SESSION.shownote的值,那么您有竞争条件并应使用cflock。
虽然您的示例没有包含任何此类检查,但可能开发人员没有任何理由设置变量。假设您的表单处理脚本检查是否存在SESSION.shownote,而有条件地发送确认电子邮件,如果该条件为真。
我将展示比赛状况。假设用户有2个浏览器窗口打开您的示例表单。两者共享同一会话,并且表单同时提交。我们将这些提交称为ONE和TWO。
处理可能会发生这种情况,这不会导致任何问题:
但它可能会发生这种情况,这是一个问题:
在这种情况下,不锁定会话范围会导致意外行为。