트랜잭션 이해

JDBC 드라이버 다운로드

트랜잭션은 작업의 논리적 단위로 결합된 작업 그룹입니다. 시스템에 오류가 발생할 수 있지만, 트랜잭션 내 각 작업의 일관성과 무결성을 제어하고 유지하기 위해 사용됩니다.

SQL Server용 Microsoft JDBC 드라이버에서 트랜잭션은 로컬 또는 분산 트랜잭션의 두 가지입니다. 트랜잭션은 격리 수준을 사용할 수도 있습니다. JDBC 드라이버에서 지원하는 격리 수준에 대한 자세한 내용은 격리 수준 이해를 참조 하세요.

응용 프로그램에서는 Transact-SQL 문 또는 JDBC 드라이버에서 제공하는 메서드를 사용하여 트랜잭션을 제어해야 하지만 두 가지 모두를 이용할 수는 없습니다. 동일한 트랜잭션에서 Transact-SQL 문과 JDBC API 메서드를 둘 다 사용하면 트랜잭션을 정상적으로 커밋할 수 없거나, 트랜잭션이 커밋 또는 롤백되고 예상치 않은 새로운 트랜잭션이 시작되거나, "트랜잭션 다시 시작 실패" 예외 등의 문제가 발생할 수 있습니다.

로컬 트랜잭션 사용

트랜잭션이 단일 단계 트랜잭션이고 데이터베이스에서 직접 처리되는 경우 로컬로 간주됩니다. JDBC 드라이버는 setAutoCommit, commit, rollbackSQLServerConnection 클래스의 다양한 메서드를 사용하여 로컬 트랜잭션을 지원합니다. 로컬 트랜잭션은 일반적으로 응용 프로그램에서 명시적으로 관리하거나 Java 플랫폼인 EE(Enterprise Edition) 응용 프로그램 서버에서 자동으로 관리합니다.

다음 예제에서는 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 선택 API 사양의 JDBC API에 추가되었습니다. 분산 트랜잭션 관리는 일반적으로 Java EE 응용 프로그램 서버 환경의 JTS(Java 트랜잭션 서비스) 트랜잭션 관리자에 의해 자동으로 수행됩니다. 그러나 SQL Server용 Microsoft JDBC 드라이버에서는 임의의 JTA(Java Transaction API) 규격 트랜잭션 관리자 하에서 분산 트랜잭션을 지원합니다.

JDBC 드라이버는 MS DTC(Microsoft Distributed Transaction Coordinator)와 원활하게 통합되어 SQL Server에서 진정한 분산 트랜잭션을 지원합니다. MS DTC는 Microsoft에서 Microsoft Windows 시스템용으로 제공하는 분산 트랜잭션 기능입니다. MS DTC는 Microsoft의 검증된 트랜잭션 처리 기술을 사용하여 완전한 2단계 분산 커밋 프로토콜 및 분산 트랜잭션 복구와 같은 XA 기능을 지원합니다.

분산 트랜잭션을 사용하는 방법에 대한 자세한 내용은 XA 트랜잭션 이해를 참조하세요.

참고 항목

JDBC 드라이버로 트랜잭션 수행