ColdFusion 9.0 Resources |
cflockDescriptionEnsures the integrity of shared data. Instantiates the following kinds of locks:
Syntax<cflock timeout = "time-out in seconds" name = "lock name" scope = "Application|Server|Session|Request" throwOnTimeout = "yes|no" type = "readOnly|exclusive"> <!--- CFML to be synchronized. ---> </cflock> Note: You can specify
this tag’s attributes in an attributeCollection attribute
whose value is a structure. Specify the structure name in the attributeCollection attribute
and use the tag’s attribute names as structure keys.
See alsocfapplication, cfassociate, cfmessagebox,Using Persistent Data and Locking in the Developing ColdFusion Applications Attributes
Note: Limit the scope of code
that updates shared data structures, files, and CFXs. Exclusive
locks are required to ensure the integrity of updates, but read-only
locks are faster. In a performance-sensitive application, substitute
read-only locks for exclusive locks where possible, for example,
when reading shared data.
UsageColdFusion MX is a multi-threaded server; it can process multiple page requests at a time. Use the cflock tag for these purposes:
DeadlocksA deadlock is a state in which no request can execute the locked section of a page. After a deadlock occurs, neither user can break it, because all requests to the protected section of the page are blocked until the deadlock can be resolved by a lock time-out. The cflock tag uses kernel level synchronization objects that are released automatically upon time out and/or the abnormal termination of the thread that owns them. Therefore, while processing a cflock tag, ColdFusion never deadlocks for an infinite period. However, large time-outs can block request threads for long periods, and radically decrease throughput. To prevent this, always use the minimum time-out value. Another cause of blocked request threads is inconsistent nesting of cflock tags and inconsistent naming of locks. If you nest locks, everyone accessing the locked variables must consistently nest cflock tags in the same order. Otherwise, a deadlock can occur. These examples show situations that cause deadlocks:
The following deadlock could occur if you tried to nest an exclusive lock inside a read lock:
The following code shows this scenario: <cflock timeout = "60" scope = "SESSION" type = "readOnly"> ............... <cflock timeout = "60" scope = "SESSION" type = "Exclusive"> ......... </cflock> </cflock> To avoid a deadlock, everyone who nests locks must do so in a well-specified order and name the locks consistently. If you must lock access to the Server, Application, and Session scopes, do so in this order:
Example<!--- This example shows how cflock can guarantee consistency of data updates to variables in the Application, Server, and Session scopes. ---> <!--- Copy the following code into an Application.cfm file in the application root directory. ---> <!---------------- Beginning of Application.cfm code ---------------> <!--- cfapplication defines scoping for a ColdFusion application and enables or disables storing of application and session variables. Put this tag in a special file called Application.cfm. It is run before any other ColdFusion page in its directory. ---> <!--- Enable session management for this application. ---> <cfapplication name = "ETurtle" sessionTimeout = #CreateTimeSpan(0,0, 0, 60)# sessionManagement = "yes"> <!--- Initialize session and application variables used by E-Turtleneck. Use session scope for the session variables. ---> <cflock scope = "Session" timeout = "30" type = "Exclusive"> <cfif NOT IsDefined("session.size")> <cfset session.size = ""> </cfif> <cfif NOT IsDefined("session.color")> <cfset session.color = ""> </cfif> </cflock> <!--- Use an application lock for the application-wide variable that keeps track of the number of turtlenecks sold. For a more efficient, but more complex, way of handling Application scope locking, see the "Developing ColdFusion Applications"---> <cflock scope = "Application" timeout = "30" type = "Exclusive"> <cfif NOT IsDefined("application.number")> <cfset application.number = 0> </cfif> </cflock> <!----------------------- End of Application.cfm -----------------------> <h3>cflock Example</h3> <cfif IsDefined("form.submit")> <!--- The form has been submitted; process the request. ---> <cfoutput> Thanks for shopping E-Turtleneck. You chose size <b>#form.size#</b>, color <b>#form.color#</b>.<br><br> </cfoutput> <!--- Lock the code that assigns values to session variables. ----> <cflock scope = "Session" timeout = "30" type = "Exclusive"> <cfparam name = session.size Default = #form.size#> <cfparam name = session.color Default = #form.color#> </cflock> <!---- Lock the code that updates the Application scope number of turtlenecks sold. ---> <cflock scope = "Application" timeout = "30" type = "Exclusive"> <cfset application.number = application.number + 1> <cfoutput> E-Turtleneck has now sold #application.number# turtlenecks! </cfoutput> </cflock> <cfelse> <!--- Show the form only if it has not been submitted. ---> <cflock scope = "Application" timeout = "30" type = "Readonly"> <cfoutput> E-Turtleneck has sold #application.number# turtlenecks to date. </cfoutput> </cflock> <form method="post" action="cflocktest.cfm"> <p>Congratulations! You selected the most comfortable turtleneck in the world. Please select color and size.</p> <table cellspacing = "2" cellpadding = "2" border = "0"> <tr> <td>Select a color.</td> <td><select type = "Text" name = "color"> <option>red <option>white <option>blue <option>turquoise <option>black <option>forest green </select> </td> </tr> <tr> <td>Select a size.</td> <td><select type = "Text" name = "size" > <option>XXsmall <option>Xsmall <option>small <option>medium <option>large <option>Xlarge </select> </td> </tr> <tr> <td>Press Submit when you are finished making your selection.</td> <td><input type = "Submit" name = "submit" value = "Submit"> </td> </tr> </table> </form> </cfif> |