隔離等級
使用鎖定做為交易控制機制,可以解決並行問題。鎖定可讓所有的交易彼此在完全隔離的情況下執行,雖然任何時候都可能有一個以上的交易在執行。交易準備好接受不一致資料的等級,稱為隔離等級。提高的隔離等級可針對資料不一致提供更多的保護,但缺點是並行數目會減少。
在 SQL Server Compact 3.5 中,應用程式需要的隔離等級決定 SQL Server Compact 3.5 使用的鎖定行為。
SQL Server Compact 3.5 支援下列的隔離等級 (從最低到最高)︰
讀取認可 (SQL Server Compact 3.5 預設值)
可重複讀取
可序列化 (交易彼此完全隔離)
當隔離等級提高,資料在資料不一致上就獲得越多的保護。然而,這會降低交易的並行,並影響多使用者存取。
注意
SQL Server Compact 3.5 確保一個交易無法讀取另一個交易未認可的資料 (中途讀取)。只要使用資料頁版本控制機制就可以做到,因為該機制讓使用者不必要求鎖定資料就可讀取資料。這提供讀取 (SELECT) 作業的例外並行。
隔離等級和並行問題
下表顯示隔離的等級,以及該等級提出的並行問題。
注意
可能發生的並行問題包括未認可的相依性、不一致的分析以及幽靈讀取 (Phantom Read) 等。如需並行問題的詳細資訊,請參閱<並行>。
隔離等級 |
未認可的相依性 (強行讀取) |
不一致的分析 (非重複讀取) |
幽靈讀取 |
---|---|---|---|
讀取認可 |
否 |
是 |
是 |
可重複讀取 |
否 |
否 |
是 |
可序列化 |
否 |
否 |
否 |
隔離等級可以用程式設計的方式設定,或是使用 SQL 語法 SET TRANSACTION ISOLATION LEVEL 設定。如需詳細資訊,請參閱<交易隔離等級>。
交易範圍下的隔離等級
System.Transaction 的預設隔離等級為 Readcommitted。不過,根據預設,交易範圍中的交易會在隔離等級設定為 Serializable 的情況下執行。因此,將 SQL Server Compact 3.5 連接編列為交易範圍時,隱含交易 (針對交易範圍在內部建立的 SQL Server Compact 3.5 交易) 預設會在 Serializable 隔離等級執行。TransactionScope 類別的某些多載建構函式會接受隔離等級當做參數。這些建構函式應該用於為隱含交易指定不同的隔離等級值。如果 SQL Server Compact 3.5 不支援指定的隔離等級,將 SQL Server Compact 3.5 連接編列到交易範圍將會擲回例外狀況。
同時,指定為連接字串一部分的 default lock timeout 屬性會管理交易將等待的時間。不過,當連接編列到 TransactionScope 時,TransactionScope 的 TimeSpan 會覆寫此屬性。例如,如果包含 1000 毫秒當做 default lock timeout 和連接之值的 ConnectionString 編列在 100 毫秒的 TransactionScope 中,存在交易僅會持續 100 毫秒而非 1000 毫秒。也就是說,如果您想讓應用程式擁有較長的交易逾時,並在 TransactionScope 中執行命令,您必須同時在連接字串和 TransactionScope 的 TimeSpan 中指定逾時值。
注意
default lock timeou 的預設值為 2000 毫秒,而 TransactionScope 的預設值為 1 分鐘。