2013-10-05 33 views
4

我知道使用<cflock>的正確方式是www開發者的一個相當大的話題。cflock標籤的正確使用ColdFusion

正如我想更好地理解它,我已經創建了一個簡單的UDF,它需要一個會話數組,我想知道這是否是一個正確的方法來考慮它一個簡單的UDF。

<cffunction name="currentCartQuantity" access="public" returntype="string"> 
<cfargument name="partnumber" type="numeric" required="yes"> 
<cfargument name="data" type="array" required="yes"> 

<cfset var return_data = "0" > 
<cflock type="readonly" scope="session" timeout="1"> 
    <cfloop from="1" to="#arrayLen(arguments.data)#" index="idx"> 
     <cfif arguments.data[idx].partnumber IS arguments.partnumber > 
      <cfset return_data = arguments.data[idx].quantity >  
     </cfif> 
    </cfloop> 
</cflock> 
<cfreturn return_data > 
</cffunction> 

這是一個簡單的函數,它接受一個數組類型的參數,它是一個購物車的會話變量。它也需要一個數字partnumber。然後搜索結構數組以查找匹配值。

因爲這是一個會話數組,我想我會對其應用一個cflock,這樣它就知道要鎖定數組的讀取,以防CF版本有任何不同,我已經使用ColdFusion 8,我希望任何經驗豐富的CF開發人員能夠確認這是鎖定會話變量讀取的正確方法。

當一個頁面被加載時,這個函數最多可以處理200次,這是處理這種類型的數據的最佳方式,cflock

+0

我沒有以任何方式看到數組更改值,爲什麼要鎖定會話範圍?不涉及你的問題,但你的函數返回的東西只基於最後的數組元素,而不是每個數組元素。 –

+0

這個想法是,*其他請求*可能會改變數組,丹,鎖是保護*代碼*。考慮到這種情況(根據我的答案),這是一個有爭議的問題。至於你的其他觀察......是的,好點。我認爲他們可能會想在發現自己的價值後從循環中「突破」。 –

回答

3

通過ColdFusion中的值複製數組,因此它不是會話作用域中的數組,它是其副本。無需鎖定它。

需要,以確保您的所有功能,局部變量VAR ED:idx不是。

+2

@ user125264 - 雖然它不適用於這種情況,但需要注意的是:它是淺拷貝。如果數組內容是複雜的對象(結構,...),那麼這些複雜的對象將不會被值傳遞,而需要被鎖定。 – Leigh

+3

好點。在這種情況下,我會仔細研究鎖定發生的位置......我可能會錯誤地將代碼解耦/封裝,並鎖定調用代碼,而不是在UDF中。 –