了解隔離等級

下載下載 JDBC 驅動程式

交易會指定隔離等級,以定義如何將一個交易與其他交易隔離。 隔離是不同交易所做的資源或資料修改的分隔。 系統會描述允許並行處理副作用的隔離等級,例如中途讀取或虛設專案讀取。

交易隔離等級會控制下列效果:

  • 在讀取資料時是否採用鎖定,以及要求哪一類型的鎖定。

  • 保留讀取鎖定的時間長度。

  • 參考其他交易修改資料列的讀取作業:

    • 封鎖資料列上的獨佔鎖定直到釋放它為止。

    • 擷取在啟動陳述式或交易時即存在的資料列認可版本。

    • 讀取未認可的資料修改。

選擇隔離等級

選擇交易隔離等級並不會影響為保護資料修改所取得的鎖定。 交易一律會取得它所修改之任何資料的獨佔鎖定。 它會保留該鎖定,直到交易完成為止,不論為該交易設定的隔離等級為何。 針對讀取作業,交易隔離等級主要會定義如何保護作業,使其不受其他交易的影響。

較低的隔離等級會提高許多使用者同時存取資料的能力。 但是,它會增加使用者可能會看到的並行效果數目,例如中途讀取或遺失的更新。 相反地,較高的隔離等級會減少使用者可能會看到的並行效果類型。 但是它需要更多的系統資源,而且會增加一個交易封鎖另一個交易的可能性。 選擇適當的隔離等級需視應用程式的資料完整性需求與每個隔離等級的額外負荷平衡而定。

最高的隔離等級(可序列化)可保證交易會在每次重複讀取作業時取得完全相同的資料。 但它使用的鎖定層級可能會影響多使用者系統中的其他使用者。 最低隔離等級為讀取未認可,可以擷取其他交易已修改但尚未認可的資料。 所有並行副作用可能會在讀取未認可時發生,不過沒有讀取鎖定或版本控制,所以會將額外負荷降至最低。

備註

下表顯示不同隔離等級所允許的並行副作用。

隔離等級 中途讀取 不可重複的讀取 虛設項目 (Phantom)
讀取未認可
讀取認可
可重複讀取
快照式
可序列化

交易必須在至少可重複讀取的隔離等級執行,以避免在兩個交易各自取出相同的資料列時,可能發生的更新失敗。 然後,交易會根據原始抓取的值來更新資料列。 如果兩個交易都使用單一 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 隔離等級的詳細資訊,請參閱 Database Engine 線上叢書的<SQL Server 中的隔離等級>。

另請參閱

以 JDBC 驅動程式執行交易
SET TRANSACTION ISOLATION LEVEL (Transact-SQL)