LINQ to SQL 支援樂觀並行控制。 下表描述 LINQ to SQL 文件中適用於樂觀併發控制的詞彙:
| 條款 | 說明 |
|---|---|
| 並行 | 兩個以上的用戶同時嘗試更新相同的資料庫數據列的情況。 |
| 併發衝突 | 兩個或多個用戶同時嘗試將衝突值提交至數據列的一或多個數據行的情況。 |
| 並行控制 | 用來解決並行衝突的技術。 |
| 樂觀並行控制 | 在允許提交變更之前,先檢查其他交易是否已改變列中的值的技術。 與 悲觀並行控制形成對比,這會鎖定記錄以避免並行衝突。 樂觀控制之所以得名,是因為它認為一個交易干擾另一個交易的可能性不大。 |
| 衝突解決 | 重新整理衝突項目的過程,方法是再次查詢資料庫,然後調和差異。 重新整理物件時,LINQ to SQL 變更追蹤器會保存下列資料: - 原本取自資料庫並用於更新檢查的值。 - 後續查詢中的新資料庫值。 LINQ to SQL 接著會判斷物件是否發生衝突(也就是說,其成員值的一或多個值是否已變更)。 如果對象發生衝突,LINQ to SQL 接下來會決定其成員中的哪一個發生衝突。 LINQ to SQL 探索到的任何成員衝突會新增至衝突清單。 |
在 LINQ to SQL 物件模型中,當下列兩個條件都成立時,就會發生 開放式並行衝突 :
用戶端會嘗試將變更提交至資料庫。
自用戶端上次讀取之後,資料庫中已更新一或多個更新檢查值。
解決此衝突的過程包含找出哪些物件成員存在衝突,然後決定您希望如何處理。
備註
只有對應為 Always 或 WhenChanged 的成員參與樂觀並發性檢查。 不會針對標示 Never的成員執行任何檢查。 如需詳細資訊,請參閱UpdateCheck。
範例
例如,在下列案例中,User1 會藉由資料庫查詢一列,開始準備更新。 User1 會收到具有 Alfreds、Maria 和 Sales 值的數據列。
User1 想要將「經理」欄位的值變更為 Alfred,並將「部門」欄位的值變更為 Marketing。 在 User1 可以提交這些變更之前,User2 已將變更提交至資料庫。 因此,現在 Assistant 欄位的值已變更為 Mary,而部門欄位的值已變更為服務。
當 User1 現在嘗試提交變更時,提交會失敗,並拋出 ChangeConflictException 例外狀況。 之所以會發生這個結果,是因為 Assistant 數據行和 Department 數據行的資料庫值不是預期的值。 助理和部門欄的成員之間存在衝突。 下表摘要說明情況。
| 州 | 經理 | 小幫手 | 部門 |
|---|---|---|---|
| 原始狀態 | 阿爾弗雷德斯 | 瑪麗亞 | 銷售 |
| User1 | 阿爾佛雷德 | 行銷 | |
| User2 | 瑪麗 | 服務 |
您可以透過不同的方式來解決像這樣的衝突。 如需詳細資訊,請參閱 如何:管理變更衝突。
衝突偵測和解決檢查清單
您可以在任何詳細層級偵測並解決衝突。 在一個極端的情況下,您可以用三種方式之一(見 RefreshMode)解決所有衝突,而不需要額外考慮。 在另一方面,您可以為衝突中的每個成員指定特定動作,以解決每種類型的衝突。
在物件模型中指定或修訂 UpdateCheck 選項。
如需詳細資訊,請參閱 如何:指定哪些成員須接受並行衝突測試。
在呼叫 SubmitChanges的 try/catch 區塊中,指定您想要擲回例外狀況的點。
如需更多資訊,請參閱 如何指定並行例外狀況的擲回時機。
判斷您想要擷取多少衝突詳細數據,並據此在 try/catch 區塊中包含程序代碼。
如需詳細資訊,請參閱如何:擷取實體衝突資訊和如何:擷取成員衝突資訊。
在您的程式
try/catch代碼中包含您想要如何解決您探索的各種衝突。如需詳細資訊,請參閱 如何:藉由保留資料庫值來解決衝突、 如何:透過覆寫資料庫值解決衝突, 以及如何:合併資料庫值來解決衝突。
支援衝突探索和解決的LINQ to SQL 類型
支援在 LINQ to SQL 中開放式並行存取中解決衝突的類別和功能包括下列各項: