77家的会客2010

CFLOCK参考说明(下)
Weather:晴 ,北风 4-5级 ,最高气温8 ℃

死锁(Deadlocks)

<CFLOCK>使用核心階層同步化物件, 一但逾時或不正常的執行中止該物件就會自動被釋放掉. 因此, 當正在處理一個<CFLOCK>時, ColdFusion絕不會無限時段地鎖死(Deadlocks). 然而, 非常長的逾時設定會阻塞長時段請求的執行緒, 並很快地降低處理能力. 所以應經常使用最小的逾時容許值.
另一個阻塞請求執行緒的原因是不一致的巢狀<CFLOCK>及不一致的鎖定命名. 如果您使用巢狀鎖定, 您及任何人正在存取的被鎖定變數必須一致性地設定相同順序的巢狀<CFLOCK>. 如果每個人正在存取的被鎖定變數不遵守這個約定, 就會發生鎖死(Deadlock)現象. 鎖死是一種在網頁被鎖定部份無法執行任何請求的狀態. 網頁被保護部份的所有請求會被阻塞住直到逾時為止. 下表列出兩個造成鎖死的情形.

兩個使用者的鎖死情形(Deadlock Scenario)
使用者1 使用者2
鎖定Session範圍. 鎖定Application範圍.
鎖死: 嘗試去鎖住Application範圍, 但已經被使用者2鎖定. 鎖死: 嘗試去鎖住Session範圍, 但已經被使用者2鎖定.

 如果您嘗試在一個讀取鎖定之後去巢狀使用一個寫入鎖定, 下列鎖死情形可以取代:
一個使用者的鎖死情形(Deadlock Scenario)
使用者1

以一個讀取鎖定(Read Lock)去鎖定Session範圍.
企圖以一個專用鎖定(Exclusive Lock)去鎖定Session範圍.
鎖死 : 企圖以一個專用鎖定(Exclusive Lock)去鎖定Session範圍, 但無法辦到因為這個範圍已經被正在讀取的(Reading)鎖定了.

 下列程式碼示範這個情形:
<CFLOCK Timeout = "60" Scope = "SESSION" Type = "readOnly">
 ...............
  <CFLOCK Timeout = "60" Scope = "SESSION" Type = "Exclusive">
  .........
  </CFLOCK>
</CFLOCK>

一旦一個鎖死發生, 使用者也無法打開這個鎖死, 因為它們的請求執行被阻塞住了直到鎖死能被一個鎖定逾時解決為止.
要避免一個鎖死, 您及所有巢狀鎖定者應該好好地指定順序及為鎖定命名. 如果您必須鎖定Server, Application, 及Session範圍的的存取, 必須依照下列順序去做:

  1. 鎖定Session範圍. 在<CFLOCK>內, 指定"Session"當作Scope屬性值來表示範圍
  2. 鎖定Application範圍. 在<CFLOCK>內, 指定"Application"當作Scope屬性值來表示範圍
  3. 鎖定Server範圍. 在<CFLOCK>內, 指定"Server"當作Scope屬性值來表示範圍
  4. 解除Server範圍鎖定
  5. 解除Application範圍鎖定
  6. 解除Session範圍鎖定

注意
如果您不需要鎖定某一範圍, 您可以拿走上述該範圍那一對鎖定/解除鎖定的步驟. 例如, 如果您不需要鎖定Server範圍, 您可以拿走步驟3及4. 同樣的規則應用在以命名的鎖定上.

历史上的今天: [2008/11/17].NET调用AS/400上的程序(.NET CALL AS/400 PGM)
[2006/11/17]牙~~~痛~~~

[CFLOCK参考说明(下)]的回复

Post a Comment~