了解交易
交易是併入邏輯工作單位的作業群組。 它們是用來控制及維護交易中每個動作的一致性與完整性,儘管系統可能會發生錯誤。
利用 Microsoft JDBC Driver for SQL Server,交易可以是本機或分散式交易。 交易也可使用隔離等級。 如需 JDBC 驅動程式所支援之隔離等級的詳細資訊,請參閱了解隔離等級。
應用程式應該使用 Transact-SQL 陳述式或 JDBC Driver 所提供的方法來控制交易,但不可同時使用這兩者。 針對相同的交易同時使用 Transact-SQL 陳述式和 JDBC API 方法可能會導致問題發生,例如無法依照預期方式認可交易、交易已認可或回復但新的交易非預期地啟動,或者發生「無法繼續交易」例外狀況。
使用本機交易
當交易為單一階段交易時,便會視為本機交易,該交易是由資料庫直接處理。 JDBC 驅動程式 使用 SQLServerConnection 類別的各種方法以支援本機交易,包括 setAutoCommit、commit 與 rollback。 本機交易通常是由應用程式明確管理,或由 Java Platform Enterprise Edition (Java EE) 應用程式伺服器自動管理。
下列範例會執行 try
區塊中由二個個別陳述式組成的本機交易。 這些陳述式是針對 AdventureWorks2022 範例資料庫中的 Production.ScrapReason 資料表執行,若沒有發生任何例外狀況,便會獲得認可。 如果擲回例外狀況,catch
區塊中的程式碼便會復原交易。
public static void executeTransaction(Connection con) {
try {
//Switch to manual transaction mode by setting
//autocommit to false. Note that this starts the first
//manual transaction.
con.setAutoCommit(false);
Statement stmt = con.createStatement();
stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Wrong size')");
stmt.executeUpdate("INSERT INTO Production.ScrapReason(Name) VALUES('Wrong color')");
con.commit(); //This commits the transaction and starts a new one.
stmt.close(); //This turns off the transaction.
System.out.println("Transaction succeeded. Both records were written to the database.");
}
catch (SQLException ex) {
ex.printStackTrace();
try {
System.out.println("Transaction failed.");
con.rollback();
}
catch (SQLException se) {
se.printStackTrace();
}
}
}
使用分散式交易
分散式交易會在兩個或以上的網路資料庫上更新資料,並同時保留重要的不可部分完成、一致、獨立且持久的 (ACID) 交易處理屬性。 分散式交易支援已新增至 JDBC 2.0 Optional API 規格中的 JDBC API。 分散式交易的管理通常是由 Java EE 應用程式伺服器環境中的 Java Transaction Service (JTS) 交易管理員自動執行。 然而,Microsoft JDBC Driver for SQL Server 支援任何 Java Transaction API (JTA) 相容之交易管理員下的分散式交易。
JDBC 驅動程式與 Microsoft Distributed Transaction Coordinator (MS DTC) 密切整合,以提供 SQL Server 實際的分散式交易支援。 MS DTC 是一種由 Microsoft 針對 Microsoft Windows 系統所提供的分散式交易機能。 MS DTC 使用來自 Microsoft 經過驗證的交易處理技術以支援 XA 功能,例如完整的二階段分散式認可通訊協定,以及分散式交易的復原。
如需如何使用分散式交易的詳細資訊,請參閱了解 XA 交易。