User Guide
222 Chapter 2: ColdFusion Tags
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.
Usage
ColdFusion MX is a multithreaded server; it can process multiple page requests at a time. Use the
cflock tag for these purposes:
• To ensure that modifications to shared data and objects made in concurrently executing
requests occur sequentially.
• Around file manipulation constructs, to ensure that file updates do not fail because files are
open for writing by other applications or tags.
• Around CFX invocations, to ensure that ColdFusion can safely invoke CFXs that are not
implemented in a thread-safe manner. (This applies only to CFXs developed in C++ using the
CFAPI.)
To work safely with ColdFusion, a C++ CFX that maintains and manipulates shared (global) data
structures must be made thread-safe; however, this requires advanced knowledge. You can use a
CFML custom tag wrapper around a CFX to make its invocation thread-safe.
When you display, set, or update variables in a shared scope, use the
scope attribute to identify
the scope as Server, Application or Session.
Deadlocks
A deadlock is a state in which no request can execute the locked section of a page. Once 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 timeout.
The
cflock tag uses kernel level synchronization objects that are released automatically upon
timeout and/or the abnormal termination of the thread that owns them. Therefore, while
processing a
cflock tag, ColdFusion never deadlocks for an infinite period of time. However,
very large timeouts can block request threads for long periods, and radically decrease throughput.
To prevent this, always use the minimum timeout 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.
throwOnTimeout Optional Yes How timeout conditions are handled.
• Yes: exception is generated for the timeout.
• No: execution continues past this tag.
type Optional Exclusive • readOnly: lets more than one request read shared data.
• exclusive: lets one request read or write shared data.
Attribute Req/Opt Default Description