我使用的ColdFusion MX 8.我最近有一個情況似乎變量會話之間進行「交換」。我發現有關整個會話交換的一些信息,但事實並非如此。它只是一個被交換的變量,而不是整個會話。我的代碼片段如下:Coldfusion變量不是用「var」聲明的,全球性如何?
var idArray = ListToArray(arguments.event.getArg("itemIDs"));
var oItemDetail = 0;
var oItem = 0; //Inserting this line seems to have fixed the error.
var i = 0;
for (i=1;i lte ArrayLen(idArray);i=i+1) {
//Log Spot #1 – cflog idArray[i] and arguments.event.getArg("statusNotes")
oItem = getItemService().getItem(idArray[i]);
oItemDetail = getItemService().getItemDetail();
oItemDetail.setItemID(oItem.getItemID());
oItemDetail.setStatusNotes(arguments.event.getArg("statusNotes"));
getItemService().saveItem(oItem);
getItemService().saveItemDetail(oItemDetail);
}
//getItem and getItemDetail just call getTransfer().get()
//saveItem and saveItemDetail just call getTransfer().save()
例如,在登錄現貨#1,idArray [I]可能是「1」,和狀態注事件ARG可能是「ABC」。
但是,如果另一個人在另一個會話中使用另一個登錄名,在另一個地方,另一個瀏覽器等等。使用此功能在完全相同的時間,使用idArray [I] =「2」和狀態注=「高清」,那麼項目詳細信息「ABC」的可能,而不是重視項目「2」和項目詳細信息「高清」附加項「 1」 。
事實上,在日誌點#1中,記錄的變量是正確的,但在數據庫中它們被交換時,指向這些代碼行作爲嫌疑犯。
通過在頂部聲明「var oItem」,此問題已消失。
所以我想我對這個啓示有點震驚。我會認爲沒有宣佈我的本地變量將意味着另一個變量,使用相同的名稱,在另一個功能,但在相同的會話可能會被覆蓋。但這似乎是某種內部記憶問題。變量甚至不會被覆蓋,而是在會話之間交換!
我想知道是否有人有類似的經歷,並可以對此有所瞭解?
您的回答很有幫助,謝謝。所以,這是因爲CFC由所有會話共享,而且變量是局部在CFC作爲一個整體,而不是單獨的函數調用。 爲什麼變量會實際交換,我還是有點困惑。我會理解它們是否被簡單地覆蓋,但是這兩個變量都保持不變,並且每個會話都被引用。 但現在我知道共享內存問題發生在哪裏,這是一個小細節。 – 2012-04-02 03:05:37
只有在所有會話共享的持久範圍內(如應用程序或服務器)共享CFC,才能共享所有會話使用的CFC。很可能你創造了所謂的「競爭條件」。你有兩個用戶同時擊中共享對象,並且由於對象作用域變量取回了彼此的數據而不是自己的數據。 – 2012-04-02 12:50:58