JAVA 분산 트랜잭션에 대한 심층적인 이해
이 기사는 주로 JAVA 분산 트랜잭션에 대한 심층적인 이해를 소개합니다. 편집자는 이것이 꽤 좋다고 생각합니다. 이제 공유하고 참고용으로 제공하겠습니다. 에디터를 따라 살펴보겠습니다
1. 분산 트랜잭션이란? 분산 트랜잭션은 트랜잭션 참여자, 트랜잭션을 지원하는 서버, 리소스 서버 및 트랜잭션 관리자가 서로 다른 분산 시스템에 위치하는 것을 말합니다. 다른 노드에서. 위의 내용은 Baidu Encyclopedia의 설명입니다. 간단히 말해 대규모 작업은 여러 가지 작은 작업으로 구성됩니다. 이러한 작은 작업은 서로 다른 서버에 분산되어 있으며 분산 트랜잭션은 이러한 작은 작업이 모두 성공하는지 확인해야 합니다. 모두 실패하세요. 기본적으로 분산 트랜잭션은 서로 다른 데이터베이스의 데이터 일관성을 보장하는 것입니다.
2. 분산 트랜잭션이 발생하는 이유
2.1. 데이터베이스 하위 데이터베이스 및 하위 테이블1년 동안 단일 데이터베이스 테이블에서 생성된 데이터가 1000W를 초과하는 경우 하위 데이터베이스를 고려해야 합니다. 구체적으로 하위 데이터베이스와 하위 테이블에 대해서는 여기서는 설명하지 않겠습니다. 간단히 말하면, 원래 하나의 데이터베이스가 여러 개의 데이터베이스가 된 것입니다. 이때, 작업이 01 라이브러리와 02 라이브러리에 모두 접근하여 데이터의 일관성이 보장되어야 한다면 분산 트랜잭션을 사용해야 합니다.
2.2 SOA 적용
소위 SOA는 서비스 중심 비즈니스입니다. 예를 들어, 원래 단일 시스템이 전체 전자상거래 웹사이트를 지원했지만 이제는 전체 웹사이트가 해체되어 주문 센터, 사용자 센터, 재고 센터로 분리되었습니다. 주문 센터에는 주문 정보를 저장하는 특수 데이터베이스가 있고, 사용자 센터에도 사용자 정보를 저장하는 특수 데이터베이스가 있으며, 재고 센터에도 재고 정보를 저장하는 특수 데이터베이스가 있습니다. 이때 주문과 재고를 동시에 운영하려면 주문 데이터베이스와 재고 데이터베이스가 필요합니다. 데이터 일관성을 보장하려면 분산 트랜잭션을 사용해야 합니다.
위의 두 상황은 겉모습은 다르지만 운영할 데이터베이스가 더 많다는 점에서 본질적으로는 동일합니다!
3. 트랜잭션의 ACID 특성
3.1. 원자성(A)
소위 원자성이란 전체 트랜잭션의 모든 작업이 완료되거나 전혀 수행되지 않으며 중간 상태가 없음을 의미합니다. 트랜잭션 실행 중에 오류가 발생하면 모든 작업이 롤백되고 전체 트랜잭션은 한 번도 실행되지 않은 것처럼 됩니다.
3.2. 일관성(C)
거래 실행은 시스템의 일관성을 보장해야 합니다. 예를 들어 A가 B에게 50위안을 성공적으로 이체한 경우. transaction, 동시성이 아무리 많아도 무슨 일이 일어나더라도 거래가 성공적으로 실행된다면 최종 계좌 A는 450위안, 계좌 B는 350위안이 되어야 합니다.
3.3. 격리(I)
소위 격리란 트랜잭션이 서로 영향을 미치지 않으며 한 트랜잭션의 중간 상태가 다른 트랜잭션에서 인식되지 않음을 의미합니다.
3.4. 내구성(D)
지속성이란 단일 트랜잭션이 완료된 후 정전이 발생하거나 정전이 발생하더라도 트랜잭션으로 인해 변경된 데이터가 데이터베이스에 완전히 저장되는 것을 의미합니다. 이런 식으로 시스템이 다운되었습니다.
4. 분산 거래의 적용 시나리오
4.1.결제
결제는 구매자의 계좌에서 돈을 차감하는 동시에 판매자의 계좌에 돈을 추가하는 것입니다. 트랜잭션에서 실행되면 모두 성공하거나 모두 실패합니다. 구매자 센터에 속하는 구매자 계정은 구매자 데이터베이스에 해당하고, 판매자 계정은 판매자 데이터베이스에 해당하는 판매자 센터에 속합니다. 서로 다른 데이터베이스에 대한 작업은 분산 트랜잭션을 도입해야 합니다.
4.2. 온라인 주문
구매자가 전자상거래 플랫폼에서 주문할 때 일반적으로 두 가지 작업이 필요합니다. 하나는 재고를 공제하는 것이고, 두 번째는 일반적으로 주문 상태를 업데이트하는 것입니다. 데이터 일관성을 보장하려면 분산 트랜잭션을 사용해야 합니다.
5. 일반적인 분산 트랜잭션 솔루션
5.1. XA 프로토콜 기반의 2단계 제출
XA는 Tuxedo에서 제안하는 분산 트랜잭션 프로토콜입니다. XA는 크게 트랜잭션 관리자와 로컬 리소스 관리자의 두 부분으로 나뉩니다. 로컬 리소스 관리자는 종종 데이터베이스에 의해 구현되며 Oracle 및 DB2와 같은 상용 데이터베이스는 모두 XA 인터페이스를 구현하며 트랜잭션 관리자는 전역 스케줄러 역할을 하며 각 로컬 리소스의 제출 및 롤백을 담당합니다. XA가 분산 트랜잭션을 구현하는 원리는 다음과 같습니다.
일반적으로 XA 프로토콜은 비교적 간단하며, 상용 데이터베이스가 XA 프로토콜을 구현하면 분산 트랜잭션을 사용하는 비용도 상대적으로 저렴합니다. 그러나 XA에는 치명적인 단점도 있습니다. 즉, 성능이 이상적이지 않으며, 특히 동시성이 높은 트랜잭션 주문 링크에서 XA는 높은 동시성 시나리오를 충족할 수 없습니다. XA는 현재 상용 데이터베이스에서 이상적으로 지원되지만 mysql 데이터베이스에서는 이상적으로 지원되지 않습니다. MySQL의 XA 구현은 준비 단계 로그를 기록하지 않으며 기본 데이터베이스와 보조 데이터베이스 간에 다시 전환하면 기본 데이터베이스와 보조 데이터베이스 간의 데이터 불일치가 발생합니다. . 또한 많은 nosql은 XA를 지원하지 않으므로 XA의 애플리케이션 시나리오가 매우 좁아집니다.
5.2. 메시지 트랜잭션 + 최종 일관성
소위 메시지 트랜잭션은 메시지 미들웨어를 기반으로 하는 2단계 제출입니다. 이는 본질적으로 로컬 트랜잭션과 메시지 전송을 분산화합니다. 트랜잭션이 완료되면 로컬 작업이 성공하고 외부 메시지가 성공하거나 둘 다 실패한다는 것이 보장됩니다. 오픈 소스 RocketMQ는 이 기능을 지원합니다. 구체적인 원칙은 다음과 같습니다.
1, 시스템 A 보내기 message to the message middleware
2. 메시지 미들웨어는 예비 메시지를 저장하고 성공을 반환합니다
3. A는 로컬 트랜잭션을 실행합니다
4. A는 메시지 미들웨어에 커밋 메시지를 보냅니다
위의 4단계를 통해 메시지를 완료합니다. 사무. 위의 4단계에서 각 단계마다 오류가 발생할 수 있습니다. 하나씩 분석해 보겠습니다.
-
1단계에서 오류가 발생하면 전체 트랜잭션이 실패하고 A의 로컬 작업이 실행되지 않습니다
2단계 오류가 발생하면 전체 트랜잭션이 실패하고 A의 로컬 작업이 실행되지 않습니다.
이 때 3단계에서 오류가 발생하므로 준비 메시지를 롤백해야 합니다. .롤백하는 방법은 무엇입니까? 그 대답은 시스템 A가 메시지 미들웨어를 위한 콜백 인터페이스를 구현한다는 것입니다. 메시지 미들웨어는 트랜잭션 A가 성공적으로 실행되었는지 확인하기 위해 콜백 인터페이스를 지속적으로 실행합니다. 실패하면 준비된 메시지가 롤백됩니다.
4단계에서 오류가 발생했습니다. 이때 A의 로컬 트랜잭션이 성공했습니다. 메시지 미들웨어가 A를 롤백해야 합니까? 대답은 '아니오'입니다. 실제로 메시지 미들웨어는 콜백 인터페이스를 통해 A가 성공적으로 실행되었는지 확인할 수 있습니다. 이때 A는 실제로 메시지를 제출할 필요가 없습니다. , 이로써 전체 메시지 트랜잭션이 완료됩니다
메시지 미들웨어 기반의 2단계 커밋은 분산 트랜잭션을 메시지 트랜잭션(시스템 A의 로컬 작업 + 메시지 전송) + 로컬 작업으로 분할하기 위해 높은 동시성 시나리오에서 자주 사용됩니다. 시스템 B의 작업은 메시지 트랜잭션에 의해 구동되며, A 작업은 성공해야 하며 이때 B는 메시지를 수신하여 수행해야 합니다. 로컬 작업이 실패하면 B 작업이 성공할 때까지 메시지가 다시 전달됩니다. 이러한 방식으로 A와 B 간의 분산 트랜잭션이 구현됩니다. 원칙은 다음과 같습니다.
위의 솔루션은 A와 B의 작업을 완료할 수 있지만 A와 B는 엄격하게 일관성이 없지만 궁극적으로 성능 향상을 위해 일관성을 희생합니다. 물론 이런 종류의 게임 플레이도 위험합니다. B가 계속해서 실행에 실패하면 게임의 일관성이 파괴됩니다.
5.3, TCC 프로그래밍 모드
소위 TCC 프로그래밍 모드도 2단계 제출의 변형입니다. TCC는 전체 비즈니스 로직을 시도, 확인, 취소 작업의 세 부분으로 나누는 프로그래밍 프레임워크를 제공합니다. 온라인 주문을 예로 들면 Try 단계에서는 재고가 차감되고, 확인 단계에서는 주문 상태가 업데이트됩니다. 주문 업데이트에 실패하면 취소 단계로 진입하여 재고가 복원됩니다. 즉, TCC는 코드를 통해 2단계 제출을 인위적으로 구현합니다. 서로 다른 비즈니스 시나리오에서 작성된 코드가 다르며 복잡성도 다릅니다. 따라서 이 모델은 잘 재사용될 수 없습니다.
6. 요약
분산 트랜잭션은 본질적으로 여러 데이터베이스의 트랜잭션을 통합적으로 제어하며 제어 강도에 따라 비통제, 부분 제어 및 완전 제어로 나눌 수 있습니다. 제어 없음은 분산 트랜잭션을 도입하지 않음을 의미하며, 부분 제어는 메시지 트랜잭션 + 최종 일관성을 포함한 다양한 변형의 2단계 커밋을 의미하며, 전체 제어는 위에서 언급한 2단계 커밋을 완전히 구현하는 것을 의미합니다. 부분 제어의 장점은 동시성과 성능이 매우 좋다는 것입니다. 단점은 데이터 일관성이 약해진다는 것입니다. 전체 제어는 성능을 희생하고 일관성을 보장합니다. 어떤 방법을 사용할지는 비즈니스 시나리오에 따라 다릅니다. 기술자로서 기술이 비즈니스에 도움이 된다는 사실을 잊어서는 안됩니다. 기술을 위해 기술을 사용하지 마십시오. 다양한 비즈니스에 대한 기술 선택도 매우 중요한 능력입니다!
위 내용은 JAVA 분산 트랜잭션에 대한 심층적인 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java의 난수 생성기 안내. 여기서는 예제를 통해 Java의 함수와 예제를 통해 두 가지 다른 생성기에 대해 설명합니다.

Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.

캡슐은 3 차원 기하학적 그림이며, 양쪽 끝에 실린더와 반구로 구성됩니다. 캡슐의 부피는 실린더의 부피와 양쪽 끝에 반구의 부피를 첨가하여 계산할 수 있습니다. 이 튜토리얼은 다른 방법을 사용하여 Java에서 주어진 캡슐의 부피를 계산하는 방법에 대해 논의합니다. 캡슐 볼륨 공식 캡슐 볼륨에 대한 공식은 다음과 같습니다. 캡슐 부피 = 원통형 볼륨 2 반구 볼륨 안에, R : 반구의 반경. H : 실린더의 높이 (반구 제외). 예 1 입력하다 반경 = 5 단위 높이 = 10 단위 산출 볼륨 = 1570.8 입방 단위 설명하다 공식을 사용하여 볼륨 계산 : 부피 = π × r2 × h (4
