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