事务是组合到工作的逻辑单位的操作组。它们用于控制和维护事务中的各项操作的一致性和完整性(尽管系统中可能发生错误)。
对于 Microsoft SQL Server JDBC 驱动程序,事务可以是本地的,也可以是分布式的。事务还可以使用隔离级别。有关 JDBC 驱动程序支持的隔离级别的详细信息,请参阅了解隔离级别。
应用程序应使用 Transact-SQL 语句或 JDBC 驱动程序 提供的方法来控制事务,但不可同时使用二者。对同一事务既使用 Transact-SQL 语句又使用 JDBC API 方法可能会导致问题,例如无法在预期的时间提交事务,提交或回滚事务后又意外地开始了一个新的事务,或者出现“无法继续执行该事务”异常。
使用本地事务
当事务是单步提交事务时,该事务被视为本地的,并由数据库直接进行处理。JDBC 驱动程序通过使用 SQLServerConnection 类的各种方法支持本地事务,这些方法包括 setAutoCommit、commit 和 rollback。本地事务通常由应用程序显式管理,或者由 Java Platform, Enterprise Edition (Java EE) 应用程序服务器自动管理。
以下示例执行 try
块中包含两个独立语句的本地事务。这些语句将对 AdventureWorks SQL Server 2005 示例数据库中的 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 SQL Server JDBC 驱动程序支持任意 Java Transaction API (JTA) 兼容的分布式事务管理器下的分布式事务。
JDBC 驱动程序 与 Microsoft 分布式事务处理协调器 (MS DTC) 无缝集成,为 SQL Server 提供真正的分布式事务处理支持。MS DTC 是 Microsoft 为 Microsoft Windows 系统提供的分布式事务处理工具。MS DTC 使用 Microsoft 推出的久经考验的事务处理技术来支持 XA 功能,例如完整的两步分布式提交协议和分布式事务的恢复。
有关如何使用分布式事务的详细信息,请参阅了解 XA 事务。