1

私は単純な Form を持っています。これは、送信時に SESSION のように変数を設定します

<cfset SESSION.shownote = 1>

ユーザーに確認メールを送信した後、この変数をセッションから削除しています。

<cfset structdelete(SESSION,"shownote")>

この場合、本当に cflock を使用する必要がありますか? ここでは競合状態は考えられません。

SESSION はユーザーごとに異なるため、セッション変数で cflock を使用する必要がある状況で誰かが正確に提案できますか?

また、CF9 と CF10 はセッション ロックを自動的に処理すると聞いたことがありますが、本当ですか?

4

2 に答える 2

3

アプリケーションで SESSION.shownote の存在または SESSION.shownote の値を確認する必要がある場合は、競合状態が発生しているため、cflock を使用する必要があります。

あなたの例にはそのようなチェックは含まれていませんが、おそらく開発者は理由もなく変数を設定していません。フォーム処理スクリプトが SESSION.shownote の存在をチェックし、その条件が true の場合、条件付きで確認の電子メールを送信するとします。

競合状態を示します。ユーザーがサンプル フォームに対して 2 つのブラウザー ウィンドウを開いているとします。どちらも同じセッションを共有し、フォームは同時に送信されます。これらの提出物を ONE および TWO と呼びます。

処理は次のように行われる可能性があり、問題は発生しません。

  1. ONE は SESSION.shownote = 1 を設定します
  2. ONE は SESSION.shownote をチェックします。それが存在します; メールを送る
  3. ONE は SESSION.shownote を削除します。
  4. 2 セット SESSION.shownote = 1
  5. SESSION.shownote の 2 つのチェック。それが存在します; メールを送る
  6. TWO は SESSION.shownote を削除します。

しかし、それは次のように発生する可能性があり、これが問題です。

  1. ONE は SESSION.shownote = 1 を設定します
  2. 2 セット SESSION.shownote = 1
  3. ONE は SESSION.shownote をチェックします。それが存在します; メールを送る
  4. ONE は SESSION.shownote を削除します。
  5. SESSION.shownote の 2 つのチェック。存在しません。電子メールを送信しないでください

この場合、セッション スコープをロックしないと、予期しない動作が発生します。

于 2014-07-28T14:05:49.747 に答える