JDBC 트랜잭션, JTA (Java Transaction API) 트랜잭션 및 컨테이너 트랜잭션의 세 가지 유형이 있습니다. 스프링 트랜잭션과 같은 일반적인 컨테이너 트랜잭션. 컨테이너 트랜잭션은 주로 J2EE 애플리케이션 서버에서 제공합니다. 대부분의 컨테이너 트랜잭션은 JTA를 기반으로 완료됩니다. 이것은 JNDI 기반, 매우 복잡한 API 구현입니다. 따라서이 기사는 당분간 컨테이너 거래에 대해 논의하지 않습니다. 이 기사는 주로 J2EE 개발에서 JDBC 거래 및 JTA 거래에서 비교적 기본적인 거래를 주로 소개합니다.
JDBC 거래
JDBC의 트랜잭션을 포함한 모든 동작은 연결을 기반으로하며 거래 관리는 JDBC의 연결 객체를 통해 수행됩니다. JDBC에서 일반적으로 사용되는 트랜잭션 관련 방법은 다음과 같습니다. SetAutocommit, Commit, Rollback 등
간단한 JDBC 트랜잭션 코드는 다음과 같습니다.
public void jdbctransfer () {java.sql.connection conn = null; try {conn = conn = drivermanager.getConnection ( "jdbc : oracle : thin : @host : @host : 1521 : sid", "username", "userpwd"); // 자동 커밋을 False로 설정합니다. // true로 설정하면 데이터베이스는 각 데이터 업데이트를 트랜잭션으로 인식하고 자동으로 Conn.SetAutoCommit (false)를 제출합니다. stmt = conn.createstatement (); // 계정 A의 금액을 500 STMT.Execute ( "/ 업데이트 T_ACCOUNT SET 금액 = 금액 -500 여기서 Account_ID = 'A'"); // 계정 b의 금액을 500 stmt.execute 씩 늘리십시오 ( "/ 업데이트 t_account set molk = alk + 500 여기서 account_id = 'b'"); // 트랜잭션 제출 conn.commit (); // 트랜잭션 커밋 : 전송의 2 단계 작동은 동시에 성공합니다} catch (sqlexception sqle) {try {// 예외가 발생합니다. // 트랜잭션 롤백 : 전송의 2 단계 조작은 완전히 취소 stmt.close (); conn.close (); } catch (예외 무시) {} sqle.printstacktrace (); }}위의 코드는 간단한 전송 기능을 구현하여 트랜잭션을 통해 전송 작업을 제어하여 제출하거나 롤백합니다.
JDBC 거래의 장단점
JDBC는 Java를 사용하여 데이터베이스 트랜잭션 운영에 대한 가장 기본적인 지원을 제공합니다. JDBC 트랜잭션을 통해 여러 SQL 문을 동일한 트랜잭션에 넣어 산성 특성을 보장 할 수 있습니다. JDBC 트랜잭션의 주요 장점은 API가 비교적 간단하고 가장 기본적인 트랜잭션 운영을 구현할 수 있으며 성능이 비교적 좋습니다.
그러나 JDBC 트랜잭션에는 한 가지 제한 사항이 있습니다. JDBC 트랜잭션은 여러 데이터베이스에 걸릴 수 없습니다! ! ! 따라서 여러 데이터베이스 작업 또는 분산 시나리오가 관련된 경우 JDBC 트랜잭션은 무력합니다.
JTA 거래
JTA가 필요한 이유
일반적으로 JDBC 트랜잭션은 데이터 일관성과 같은 문제를 해결할 수 있습니다. 사용량이 비교적 간단하다는 점을 감안할 때, 많은 사람들은 Java의 거래에 대한 JDBC 거래가 있거나 일부 사람들이 프레임 워크 (예 : 최대 절전 모드, 봄) 등의 거래에 대해 알고 있음을 알고 있습니다.
JDBC 거래를 직장에서 해결할 수없는 시나리오를 발견하지 못하면, 당신이하는 프로젝트가 여전히 너무 작다 고 말할 수 있습니다. 전자 상거래 웹 사이트를 예로 들어 보겠습니다. 우리는 일반적으로 전자 상거래 웹 사이트를 가로로 제품 모듈, 주문 모듈, 쇼핑 카트 모듈, 메시지 모듈, 지불 모듈 등으로 나누고 다른 시스템에 다른 모듈을 배포하고 각 모듈은 원격 서비스 호출 (RPC) 및 기타 방법을 통해 통신합니다. 분산 시스템으로 외부 세계에 서비스를 제공하십시오.
결제 프로세스는 여러 모듈과 상호 작용해야하며 각 모듈은 다른 시스템에 배포되며 각 모듈에서 작동하는 데이터베이스는 일치하지 않습니다. 현재 JDBC는 거래를 관리하는 데 사용할 수 없습니다. 코드를 살펴 보겠습니다.
/ ** 결제 주문 처리 **/ @transactional (Rollbackfor = Exception.class) public void completrorder () {orderdao.update (); // 주문 서비스 로컬 업데이트 주문 상태 계정 ervice.update (); // 펀드 계정 서비스에 전화하여 펀드 계정에 포인트를 추가합니다. // 포인트 서비스를 호출하여 포인트 계정 계정 계정 계정 AccountingService.insert (); // 회계 시스템을 작성하려면 회계 시스템을 작성하십시오. 원래 회계 바우처 MerchantNotifyservice.notify (); // 가맹점 알림 서비스에 전화하여 상인에게 지불 결과 알림을 보냅니다}위의 코드는 간단한 지불 프로세스 운영으로 5 개의 서비스를 호출하며 모두 RPC를 통해 호출됩니다. JDBC를 사용하여 트랜잭션 일관성을 보장하는 방법은 무엇입니까? @transactional 주석을 방법에 추가했지만 분산 서비스를 사용하기 때문에 거래는 산의 영향을 달성 할 수 없습니다.
JTA 거래는 JDBC 거래보다 강력합니다. JTA 트랜잭션에는 여러 참가자가있을 수 있으며 JDBC 트랜잭션은 단일 데이터베이스 연결로 제한됩니다. 다음 Java 플랫폼의 구성 요소는 JDBC Connection, JDO Persistencemanager Object, JMS Queue, JMS Topic, ENTERPRISE JAVABEANS (EJB) 및 J2EE 커넥터 아키텍처 사양과 함께 편집 한 리소스 할당자를 JTA 트랜잭션에 참여할 수 있습니다.
JTA의 정의
Java Transaction API (JTA)는 Application Program Interface의 Java Enterprise 버전입니다. Java 환경에서는 여러 XA 리소스의 분산 트랜잭션을 완료 할 수 있습니다.
JTA와 동포 Java Transaction Service (JTS; Java TransactionService)는 J2EE 플랫폼에 분산 거래 서비스를 제공합니다. 그러나 JTA는 인터페이스 만 제공하며 특정 구현을 제공하지 않습니다. 대신 JTS 사양에 따라 J2EE 서버 제공 업체가 제공합니다. 몇 가지 일반적인 JTA 구현이 있습니다.
1. J2EE 컨테이너가 제공 한 JTA 구현 (JBOSS)
2. 독립적 인 JTA 구현 : JOTM, Atomikos와 같은. 이러한 구현은 J2EE 애플리케이션 서버를 사용하지 않는 환경에서 사용하여 분산 트랜잭션 보증을 제공 할 수 있습니다. Tomcat, Jetty 및 일반 Java 응용 프로그램과 같은.
JTA는 java.transaction.usertransaction을 제공하며 다음 방법을 정의합니다.
여기서는 일반 JDBC 작업이 사용자 추정을 사용하지 않고 JTA 작업으로 직접 변환 할 수 있다는 점에 주목할 가치가 있습니다. JTA에는 데이터 소스, 연결 및 리소스에 대한 요구 사항이 있습니다. XA 사양을 준수하고 XA 사양의 관련 인터페이스를 구현하는 클래스 만 JTA 트랜잭션에 참여할 수 있습니다. XA 사양과 관련하여 내 기사의 다른 기사에서 관련 소개를 참조하십시오. 여기에서 현재 주류 데이터베이스가 XA 사양을 지원한다는 것을 언급하겠습니다.
JTA 트랜잭션을 사용하려면 javax.sql.xadatasource, javax.sql.xaconnection 및 javax.sql.xaresource 인터페이스를 구현하는 JDBC 드라이버가 필요합니다. 이러한 인터페이스를 구현하는 드라이버는 JTA 거래에 참여할 수 있습니다. Xadatasource 객체는 Xaconnection 객체의 공장입니다. Xaconnection은 JTA 거래에 참여하는 JDBC 연결입니다.
JTA 트랜잭션을 사용하려면 Xadatasource를 사용하여 데이터베이스 연결을 생성해야하며 결과 연결은 XA 연결입니다.
XA Connection (javax.sql.xaconnection)과 비 XA (java.sql.connection) 연결의 차이점은 XA가 JTA 트랜잭션에 참여할 수 있으며 자동 커밋을 지원하지 않는다는 것입니다.
샘플 코드 :
public void jtatransfer () {javax.transaction.usertransaction tx = null; java.sql.connection conn = null; try {tx = (javax.transaction.usertransaction) context.lookup ( "java : comp/usertransaction"); // JTA 트랜잭션을 얻습니다.이 경우 JBoss 컨테이너는 javax.sql.datasource ds = (javax.sql.datasource) context.lookup ( "java :/xaoracleds")에 의해 관리됩니다. // 데이터베이스 연결 풀을 가져 오면 tx.begin ()을 지원하는 XA를 지원하는 데이터베이스 및 드라이버가 있어야합니다. conn = ds.getConnection (); // 자동 커밋을 False로 설정합니다. // true로 설정하면 데이터베이스는 각 데이터 업데이트를 트랜잭션으로 인식하고 자동으로 Conn.SetAutoCommit (false)를 제출합니다. stmt = conn.createstatement (); // 계정 A의 금액을 500 STMT.Execute ( "/ 업데이트 T_ACCOUNT SET 금액 = 금액 -500 여기서 Account_id = 'A'"); // 계정 b의 금액을 500 stmt.execute 씩 늘리십시오 ( "/ 업데이트 t_account set molk = alk + 500 여기서 account_id = 'b'"); // 계정 b의 금액을 500 stmt.execute 씩 늘리십시오 ( "/ 업데이트 t_account set molk = alk + 500 여기서 account_id = 'b'"); // 계정 b의 금액을 500 stmt.execute 씩 늘리십시오 ( "/ 업데이트 t_account set molk = alk + 500 여기서 account_id = 'b'"); // 트랜잭션 커밋 tx.commit (); // 트랜잭션 커밋 : 전송의 2 단계 작동은 동시에 성공합니다} catch (sqlexception sqle) {try {// 예외가 발생합니다. // 트랜잭션 롤백 : 전송의 2 단계 작동은 완전히 취소 된 stmt.close (); conn.close (); } catch (예외 무시) {} sqle.printstacktrace (); }} 위의 예는 JTA 트랜잭션을 사용한 전송 작업입니다. 이 작업은 J2EE 컨테이너에 상대적으로 의존하며 JNDI를 통해 사용자 변환 및 연결을 얻어야합니다.
표준 분산 거래
분산 거래에는 거래 관리자와 하나 이상의 리소스 관리자가 포함됩니다. 리소스 관리자는 모든 유형의 지속적인 데이터 저장소입니다. 거래 관리자는 모든 거래 참가자 간의 커뮤니케이션 책임을 가정합니다.
분산 거래에 대한 위의 소개를보십시오. 2PC의 트랜잭션 관리와 유사합니까? 그러나 2PC는 실제로 여러 리소스 관리자를 조정하기 위해 XA 사양을 준수하는 트랜잭션 관리자를위한 구현 방법입니다. 나는 전에 2pc와 3pc에 몇 가지 기사를 가지고 있었다. 이 기사에서는 분산 트랜잭션의 트랜잭션 관리자가 여러 거래의 통합 커밋 또는 롤백을 조정하는 방법을 소개했습니다. 또한 글로벌 트랜잭션, DTP 모델, 유연한 거래 등을 포함하여 분산 거래와 관련된 컨텐츠를 자세히 소개합니다.
JTA의 장단점
JTA의 장점은 분산 트랜잭션 솔루션과 엄격한 산을 제공한다는 것입니다. 그러나 표준 JTA 트랜잭션 관리는 많은 단점이 있기 때문에 일상 개발에서 일반적으로 사용되지 않습니다.
구현 단지
일반적으로 JTA 사용자 이동은 JNDI에서 얻어야합니다. 즉, JTA를 사용하면 JTA와 JNDI를 모두 사용해야합니다.
JTA 자체는 부피가 큰 API입니다.
일반적으로 JTA는 애플리케이션 서버 환경에서만 사용할 수 있으므로 JTA를 사용하면 코드의 재사용 성이 제한됩니다.
요약
JDBC 트랜잭션, JTA (Java Transaction API) 트랜잭션 및 컨테이너 트랜잭션의 세 가지 유형이 있습니다. 그 중 JDBC의 트랜잭션 운영 사용은 비교적 간단하고 동일한 데이터 소스의 작업을 처리하는 데 적합합니다. JTA 트랜잭션은 비교적 복잡하며 여러 데이터베이스에서 트랜잭션을 처리하는 데 사용될 수 있습니다. 그들은 분산 거래를위한 솔루션입니다.
여기에 대해 간단히 얘기하겠습니다. JTA 트랜잭션은 분산 거래를 위해 Java가 제공하는 API 세트이지만, 다른 J2EE 플랫폼마다 구현이 다르며 사용하기 편리하지 않습니다. 따라서이보다 책임있는 API는 일반적으로 프로젝트에 사용되지 않습니다. 업계에서 일반적으로 사용되는 분산 거래 솔루션에는 이제 비동기 메시지 보증, TCC, 최대 노력 알림 등이 포함됩니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.