使用cflock 让ColdFusion线程更安全

ZDNet软件频道 时间:2004-03-29 作者:Builder.com |  我要评论()
本文关键词:
每个ColdFusion 开发者都应该知道cflock标签以及和它相关的属性. 不幸地是,许多ColdFusion 开发者都对cflock 了解的太少。
本文译自Builder.com,未经许可请勿转载

每个ColdFusion 开发者都应该知道cflock标签以及和它相关的属性. 不幸地是,许多ColdFusion 开发者都对cflock 了解的太少. 在这篇文章中我将会告诉你了解标签的重要性并介绍你一些宝贵的解决问题的方法。


 

多线程要素
  为了了解锁定的意义, 你必须首先了解多线程的意义. 多线程是一个机构,ColdFusion 服务器通过它允许被执行的ColdFusion模版在同时间提出多重请求。这是一个潜在的问题,但是, 它和数据的完整性有关系。
     在Listin A中的代码是被设计来追踪从上次服务器更新以来页面访问的人数。存储这个数据最理想的地方就是ColdFusion 应用程序作用域。记住,你应用程序的所有用户就将分享应用程序作用域的数据。不久,你就会明白这个共享是让人头痛的事情。


    代码的第一部分定义应用程序作用域的变量,如果应用程序数量的请求没有定义的话,你同时也可以定义它。下一行就是每次页面执行的时候增加它的值。很简单对吗?当你的兴趣转向我刚才提到的多线程的性态和数据处理在场景之前发生的方式这两个方面的的时候这个事情就变得有些棘手。这就意味着,Listing A中的代码在保护自身潜在数据的破坏方面不能起任何作用,它是一个不安全的代码。

cfset 在场景之前如何工作
    在你了解为什么你需要熟练掌握我所说的"the three mini-steps of data manipulation,"的时候,你需要知道cfset的性能和它如何导致数据完整性的问题。ColdFusion开发者认为象变量分配这样的问题是需要一步一步的来完成;但是,在场景之前,这些问题有点棘手。下面的例子,是从Listing A中找出来的,是一个典型的cfset操作:
<cfset application.numberOfHits = application.numberOfHits + 1 >

     这看起来好像一个简单的步骤,事实上,这个进程是需要三个独立的步骤:

1         获得application.numberOfHits.当前的值

2         application.numberOfHits.加1

3         保存新的application.numberOfHits.值

这里的问题是,对于多线程来说,如果有两个或者更多的ColdFusion模版试图在同一时刻执行变量分配,那么会导致数据发生一些奇怪的事情。

     一旦Listing A中的内容被ColdFusion服务器执行两次,你的直觉告诉你application.numberOfHits变量的值是2。它的值最初是0,页面执行了两次,每次都加1,所以,最后结果就是2。
    但是,如果有两个人同时访问你的站点,那么Listing A的代码在执行两次以后,application.numberOfHits的值是1。这个结果有点意外,但是如果你记得上面的三个步骤,你将会很快的发现问题所在。看看这个情势:第一个线程执行步骤1,第二个线程执行步骤2。换句话说,第一个线程的值是0,但是第2个线程的值是1。由于第一个线程的值依然是0,接着它会将它的值增加到1,这样,我们就会获得两个都是1的值。
   这些步骤中同时有另外一个不安全的组合。对于上面的问题来说,你丢失的仅仅只是点击的数字,你的老板也许不会太注意这个。但是,如果这个数字显示的是钱,那么问题就变得严重起来。那么,现在,就让我们来看看如何避免这种问题的发生。


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134