每个ColdFusion 开发者都应该知道cflock标签以及和它相关的属性. 不幸地是,许多ColdFusion 开发者都对cflock 了解的太少. 在这篇文章中我将会告诉你了解标签的重要性并介绍你一些宝贵的解决问题的方法。
代码的第一部分定义应用程序作用域的变量,如果应用程序数量的请求没有定义的话,你同时也可以定义它。下一行就是每次页面执行的时候增加它的值。很简单对吗?当你的兴趣转向我刚才提到的多线程的性态和数据处理在场景之前发生的方式这两个方面的的时候这个事情就变得有些棘手。这就意味着,Listing A中的代码在保护自身潜在数据的破坏方面不能起任何作用,它是一个不安全的代码。
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的值。
这些步骤中同时有另外一个不安全的组合。对于上面的问题来说,你丢失的仅仅只是点击的数字,你的老板也许不会太注意这个。但是,如果这个数字显示的是钱,那么问题就变得严重起来。那么,现在,就让我们来看看如何避免这种问题的发生。