了解隔離等級
交易可指定隔離等級,以定義某個交易必須與其他交易隔離的程度。 隔離是將不同交易所做的資源或資料修改分隔開。 隔離等級是以允許的並行副作用來表示,例如,中途讀取或虛設項目讀取。
交易隔離等級可控制下列影響:
在讀取資料時是否採用鎖定,以及要求哪一類型的鎖定。
保留讀取鎖定的時間長度。
讀取作業是否參考另一個交易修改的資料列:
封鎖資料列上的獨佔鎖定直到釋放它為止。
擷取在啟動陳述式或交易時即存在的資料列認可版本。
讀取未認可的資料修改。
選擇隔離等級
選擇交易隔離等級並不會影響為保護資料修改所取得的鎖定。 交易一律會取得其所修改資料的獨佔鎖定。 不論交易所設定的隔離等級為何,交易都會保留該鎖定,直到該交易完成為止。 對於讀取作業,交易隔離等級主要會定義如何保護作業不受其他交易的影響。
較低的隔離等級將可讓更多使用者同時存取資料。 但也會增加使用者可能遇到並行作用 (例如,中途讀取或遺失的更新) 的數目。 相反的,較高的隔離等級可減少使用者遇到並行作用的類型。 但這需要更多的系統資源,且會增加某個交易封鎖另一個交易的可能性。 選擇適當的隔離等級需視應用程式的資料完整性需求與每個隔離等級的額外負荷平衡而定。
最高的隔離等級為可序列化,可確保每次交易重複讀取作業時都能擷取相同的資料。 但其使用的鎖定層級在多使用者系統中可能會影響其他使用者。 最低隔離等級為讀取未認可,可以擷取其他交易已修改但尚未認可的資料。 在讀取未認可中可能會發生所有的並行副作用,但由於沒有讀取鎖定或版本控制,因此可將額外負荷降到最低。
備註
下表顯示不同隔離等級所允許的並行副作用。
隔離等級 | 中途讀取 | 不可重複讀取 | 虛設項目 (Phantom) |
---|---|---|---|
讀取未認可 | 是 | .是 | 是 |
讀取認可 | 否 | .是 | 是 |
可重複讀取 | 否 | 無 | 是 |
快照式 | 否 | 無 | 否 |
可序列化 | 否 | 無 | No |
交易必須至少在可重複讀取的隔離等級執行,以防在兩個交易個別擷取相同資料列時可能發生的更新遺失。 然後,交易會根據原始擷取的值來更新資料列。 如果兩個交易都使用單一 UPDATE 陳述式更新資料列,而且沒有以先前擷取的值做為更新的基礎,就不會在讀取認可的預設隔離等級發生更新的遺失。
若要設定交易的隔離等級,您可以使用 SQLServerConnection 類別的 setTransactionIsolation 方法。 這個方法會根據下列其中一個連線常數,接受 int 值作為其引數:
con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
若要使用 SQL Server 的新快照隔離等級,您可以使用其中一個 SQLServerConnection
常數:
con.setTransactionIsolation(SQLServerConnection.TRANSACTION_SNAPSHOT);
或者,您可以使用:
con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED + 4094);
如需 SQL Server 隔離等級的詳細資訊,請參閱《SQL Server 線上叢書》中的<資料庫引擎的隔離等級>。
另請參閱
以 JDBC 驅動程式執行交易
SET TRANSACTION ISOLATION LEVEL (Transact-SQL)