Frage

Wann ist es angebracht zu verwenden oder es ist ilk im Gegensatz zu ?

Insbesondere interessiert mich cflock sich mit der gemeinsam genutzten Objekte in der Anwendung, Sitzung oder Serverbereiche zu schützen, aber ich bin auch daran interessiert herauszufinden, über verschiedene Verwendungen in Coldfusion sperren.

War es hilfreich?

Lösung

Sie sollten verwenden beim Lesen und Schreiben von Dingen, die in den Anwendungsbereich ändern können. Zum Beispiel:

<cfquery name="application.myData">
    select * from myTable
</cfquery>

Sie gehen zu wollen, dass sperren mit type = „exklusiv“. Überall dort, wo application.myData verwendet wird, benötigen Sie einen type = „Read-only“ zu sperren. Die Ausnahme ist Application.cfc der OnApplicationStart Methode, die sich sperrt. verwendet ebenfalls die gleiche Strategie mit den Sitzungs- und Serverbereichen.

Named Schleusen geben Ihnen mehr Kontrolle über Ihre Sicherungsstrategie. Verwenden Sie einen Namen cflock wenn Sie dynamisch Befehle sperren müssen. Zum Beispiel:

<cflock name="write_file_#session.user_type#" type="exclusive">
    <cffile action="write" name="file_#session.user_type#" output="#content#" />
</cflock>

In diesem Beispiel Benutzer von verschiedenen Typen sind erlaubt, eine Datei zur gleichen Zeit zu schreiben, aber die Benutzer mit dem gleichen session.user_type müssen aufeinander warten. Diese cflock hilft Dateikonflikt Probleme zu vermeiden.

Ein weiterer Grund, eine benannte Sperre zu verwenden, wenn Sie den Umfang Ihrer aktuellen Betrieb nicht kennen. Wenn Sie in einem instantiierten cfc sind, wie Sie wissen, welche Möglichkeiten Sie in instanziiert wurden? Variablen? Session? Anwendung? Gute Kapselung lehrt uns, dass Objekte wissen nichts außer dem, was sie gesagt. Innerhalb eines CFC, verwenden Sie eine benannte Schloss und benennen Sie es nach dem CFC oder den CFC und eine eindeutige Instanz-Variable je nach Anwendungsfall.

Andere Tipps

Weiter mit was @Mr. Nate sagte, verwenden Sperren, wenn Sie sich Sorgen um Race Conditions sind. Zum Beispiel können Sie eine Initialisierung der Session sperren, nicht aber später lesen. In ähnlicher Weise können Sie schreibt in den Anwendungsbereich sperren wollen, aber nicht lesen.

eine Lese Sperren ist viel weniger nützlich, da CF6, das Thread-sichere gemeinsame Variable Bereiche eingeführt. In den schlechten alten Tagen, wenn Sie nicht aufpassen, könnten Sie die gleiche Speicheradresse gleichzeitig Lesen und Schreiben sein. Da jedoch CF wurde Java-betrieben, ist dies kein Problem.

Named Schlösser nützlich sind, wie er gezeigt, für irgendetwas Sperren, die nicht scoped ist, wie Datei-Lese / schreibt.

Gebäude auf die anderen Vorschläge hier.

seit dem Aufkommen der CF8 ehrlich zu sein, und dass jetzt duplizieren () Objekte kopieren kann, würde ich nur Umfang Schlösser verwenden, wenn auf Anwendung, Sitzung oder Serverbereich zu schreiben (btw, auf den Serverbereich zu schreiben ist ein großer no- nicht in meinem Buch).

Wenn Sie die Daten aus lesen müssen, würde ich Duplikat () verwenden, um eine tiefe Kopie der Daten auf eine lokale Variable zu tun, und die Lesesperre alle zusammen zu vermeiden. dies wird Deadlocks verhindern.

<cflock scope="application" timeout="5" type="exlusive">
 <cfset application.data = {}>
 <cfset application.data.firstname = "tony">
</cflock>

<cfset variables.firstname = duplicate(application.data.firstname)>

Eine große Zeit genannt Verriegelung zu verwenden, wenn Sie eine „Transaktion“, die Sie alle machen wollen auf einmal sicher geschieht, beispielsweise mehrere Tabellen in einer Datenbank aktualisieren auf einmal, oder wenn Sie einfach sicherstellen möchten, dass zwei Benutzer nicht den gleiche Datenbank Datensatz zu einem Zeitpunkt zu aktualisieren, oder wenn auf dem Server in eine Datei zu lesen oder zu schreiben, die mehr als einen Benutzer zu einer Zeit haben könnte versuchen, darauf zuzugreifen.

Einfach ausgedrückt, zu jeder Zeit gibt es eine Situation, wo es Probleme geben könnte, wenn zwei Anfragen versucht, das Gleiche zur gleichen Zeit zu tun, setzen Sie dann eine benannte Sperre um es (oder wenn es sich um streng die Sitzung, Anwendung oder Serverbereich verwenden, dann eine scoped Sperre).

Ben Nadel hat einen Blogeintrag einmal, sagte:

  

"Die Art, wie ich es sehe, müssen zwei Bedingungen erfüllt sein, um das zu verlangen,   Verwendung von cflock:

     
      
  1. Eine gemeinsam genutzte Ressource zugegriffen oder aktualisiert wird.
  2.   
  3. Es muss die Möglichkeit einer Race-Bedingung sein, was ein negatives Ergebnis. "
  4.   

Sie können sogar Nest cflock Tags, wie eine benannte Sperre um eine Transaktion, und Sitzung oder Anwendung scoped Schlösser innen verschachtelt, aber nicht so mit Vorsicht - wenn man es falsch macht, können Sie eine „Sackgasse“ Situation haben könnten wo keine Anforderung kann den gesperrten Abschnitt der Seite ausführen und alle Anforderungen an den gesperrten Abschnitt einer Seite könnten blockiert werden, bis ein Timeout. (Coldfusion Handbuch Best Practices für eine verschachtelte Verriegelung beschreibt.)

Normalerweise sollten Sie immer cflock für Sitzung, Anwendung und Server verwenden Vars jederzeit Sie lesen oder diese Vars außerhalb eines Application.cfc ändert, um Rennbedingungen zu verhindern. Hier ist ein Artikel, die hilfreich sein können:

http://www.horwith.com/index .cfm / 2008/4/28 / cflock erläuterte

Edit:. weiter Um Ihre Frage zu beantworten Umfang, habe ich immer verwenden <cflock scope="application"> (zum Beispiel), wenn mit gemeinsam genutzten Ressourcen interagieren

Dies ist ein Beispiel aus der Coldfusion 8-Dokumentation, die eine Seite Variable verwendet einen „lokalen Flag“ zu schaffen, die ohne Sperren gelesen werden kann, um zu sehen, ob die Anwendungsvariablen initialisiert wurden.

Was dies bedeutet Adresse ist die Tatsache, dass wir die exklusive Sperre konditionalisieren müssen, weil es sich um eine Seite geladen wird jedes Mal ausgeführt wird, Engpässe zu der Sperre aufgrund schaffen kann mehr Verarbeitungszeit einnehmen.

Ich weiß nicht, ob bessere Techniken erschienen sind, da dies hat, aber ich denke, ich werde es hier posten sowieso. Die Coldfusion-Dokumente oft nicht gut Code liefern, also bin ich interessiert jemand zu sehen, ob können sehen, wie dieses verbessert werden kann.

  • Ich könnte die lokalen Flags setzen in der Anfrage Umfang, so dass es auch in benutzerdefinierten Tags verfügbar ist, usw. Allerdings ist es wirklich nur in app.cfm benötigt, so vielleicht ist das nicht notwendig.
  • Ich würde auch IsDefined () zugunsten von StructKeyExists () zu entfernen, damit es nicht die Bereiche alle hat, um durch.
  • Ich würde auch Dirac-Notation verwenden, um Variablen zu setzen, so dass Kapitalisierung beibehalten wird (z Anwendung [ ‚MyDSN‘] = „Aufträge“). Es macht es auch leichter zu variablen schreibt vor Ort, die ein bisschen wichtiger als Variable liest. (Dies ist nur meine Vorliebe)

Quelle: http: //livedocs.adobe. com / Coldfusion / 8 / htmldocs / help.html? content = sharedVars_18.html

<!--- Initialize local flag to false. --->
<cfset app_is_initialized = False>
<!--- Get a readonly lock --->
<cflock scope="application" type="readonly">
    <!--- read init flag and store it in local variable --->
    <cfset app_is_initialized = IsDefined("APPLICATION.initialized")>
</cflock>
<!--- Check the local flag --->
<cfif not app_is_initialized >
<!--- Not initialized yet, get exclusive lock to write scope --->
    <cflock scope="application" type="exclusive">
        <!--- Check nonlocal flag since multiple requests could get to the
                exclusive lock --->
        <cfif not IsDefined("APPLICATION.initialized") >
            <!--- Do initializations --->
            <cfset APPLICATION.varible1 = someValue >
             ... 
            <!--- Set the Application scope initialization flag --->
            <cfset APPLICATION.initialized = "yes">
        </cfif>
    </cflock>
</cfif>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top