ProgramingTip

NoSQL의 트랜잭션?

bestdevel 2020. 11. 5. 08:15
반응형

NoSQL의 트랜잭션?


데이터베이스에 대한 대안을 확장하기 위해 NoSQL을 찾고 있습니다. 이런 종류의 것들에 민감한 트랜잭션 기반 물건을 원하면 어떻게해야합니까?


일반적으로 NoSQL 솔루션은 관계형 데이터베이스보다 가벼운 트랜잭션 의미 체계를 갖지만 일정 수준 수준에서 원자 작업을 기능을 유지합니다.

일반적으로 마스터-마스터 복제를 수행하는 일관성이 떨어지고 가용성이 더 높음. 따라서 올바른 문제에 맞는 도구를 선택해야합니다.

많은 경우 단일 문서 (또는 행 등) 수준에서 트랜잭션을 제공합니다. 예를 들어 MongoDB의 경우 단일 문서에 원 자성이있는 문서가 상당히 풍부 할 수 있으므로 일반적으로 잘 작동 합니다 . 자세한 내용은 여기를 참조 하십시오 .


이 NoSQL 데이터베이스에 적용되는 가장 가까운 답변입니다. Heroku.com의 Adam Wiggins의 2007 년 블로그 게시물에 있습니다.

한 은행 계좌에서 다른 은행 계좌로 돈을 이체하기 위해 데이터베이스 트랜잭션을 사용하는 이전 예는 황소입니다. 올바른 해결은 원장 이벤트 목록 (계정 간 이체)을 저장하고 현재 잔액을 원장의 것으로 표시하는 것입니다. 기능적 언어로 프로그래밍하는 경우 (또는 그렇게 생각하는 경우)가 분명합니다.

출처 : http://adam.heroku.com/past/2007/12/17/a_world_without_sql/ (그의 웹 사이트는 확장성에 대한 아이디어를 제공합니다.)

위 단락을 다음과 같이 해석했습니다.

  1. 멤버 계정에 대한 데이터베이스를 만듭니다.
  2. 메시징 텍스트를 만듭니다. 별명 "원장".
  3. 백그라운드에서 추가하여 추가 요청을 수행합니다.

더 많은 정보. 반복 / 백그라운드 도시 : http://adam.heroku.com/past/2009/4/14/building_a_queuebacked_feed_reader_part_1/

고객 (일명 회원 또는 고객)은 다음 단계에 따라 돈을 인출합니다.

  1. 인출 요청을 신청하십시오.
  2. 요청이 서버로 전송됩니다.
  3. 서버는 큐에 넣습니다. 메시지는 "5,000 달러를 꺼내십시오."입니다.
  4. 클라이언트에 "요청이 이행되는 동안 기다려 ..."가 표시됩니다.
  5. 클라이언트 컴퓨터는 2 초마다 서버를 폴링하여 "요청이 이행 되었습니까?"묻라고습니다.
  6. 서버에서 백그라운드에서 다른 구성원의 이전 요청을 선입 선출 방식으로 수행합니다. 결국, 그들은 돈을 꺼내 달라는 고객의 요청에 도달합니다.
  7. 요청이 완료되면 고객에게 새 잔액이 포함 된 메시지가 제공됩니다.

Node.js 또는 Ruby / Rack에 익숙하다면 Heroku.com을 사용하여 작은 목업을 빠르게 만들 수 있습니다.

일반적인 아이디어는 데이터베이스에 구워진 트랜잭션을 사용하는 것보다 훨씬 낫습니다.

면책 조항 : 아직 어떤 방식으로도 구현하지 않습니다. 나는 붓에 대한 부케 인 필요가 없지만 호기심을 위해 이것에 대해 읽었습니다. 예, @gbn은 트랜잭션이있는 RDBMS가 아마도 Timmy와 저의 요구에 충분할 옳습니다. 그럼에도 불구하고 오픈 소스 도구와 " A Tornado of Razorblades " 라는 방법 웹 사이트를 통해 NoSQL 데이터베이스를 얼마나 멀리 사용할 수 있는지 볼 수있는 것 입니다.


NoSQL 은 키-값, 문서, 그래프 및 넓은 열 저장소를 포함하여 다양한 도구 및 서비스 집합을 포함합니다. 일반적으로 데이터 처리를 분산하여 데이터 저장소의 확장을 개선합니다. 트랜잭션에는 DB가 사용자 작업을 수행하는 방법에 대한 ACID 속성이 필요 합니다. ACID는 확장 가능한 방법을 제한합니다. 대부분의 NoSQL 구현을위한 내결함성 및 확장을위한 내결함성 및 가용성 구현을 위해 ACID 트랜잭션이 매우 어렵습니다.

분산 데이터 저장소는 일반적으로 인용되는 이론적 추론은 CAP 정리입니다 . 일관성, 가용성 및 파티션 허용 오차는 동시에 달성 할 수 없습니다. SQL, NoSQL 및 NewSQL 도구는 포기하는 항목에 따라 분류 할 수 있습니다. 여기 에서 좋은 수치를 수 있습니다 .

ACID를 대체하는 새롭고 약한 요구 사항 집합은 BASE ( "기본적으로 사용 가능, 소프트 상태, 최종 일관성")입니다. 그러나 최종적으로 일관된 도구 ( "결국 항목에 대한 모든 액세스는 마지막으로 업데이트 된 값을 반환합니다")는 은행과 같은 트랜잭션 응용 프로그램에서 거의 허용되지 않습니다. 여기서 좋은 아이디어는 VoltDB 와 같은 인 메모리, 열 지향 및 분산 SQL / ACID 데이터베이스를 사용하는 것입니다 . 이제는 "NewSQL"솔루션을 보는 것이 좋습니다.


이 행사에 대한 돈 거래 조언에 대해 언급하고 싶었습니다. 거래는 송금과 함께 사용하고 싶은 것입니다.

전송이 어떻게 que에 주어진 예는 훌륭하고 깔끔합니다.

이체하는 데는 감당할 수 있습니다. 사람들은 다른 계정에서 온 특정 카드를 사용하여 개체를 받거나 같은 시스템의 다른 계정으로 계정에서 평가를받을 수 있습니다. 거래의 신용 및 차변을 표시하는 시스템을 유지해야합니다.

즉, 하나의 계정에 대한 신용이 하나 이상의 계정에서 차변이 될 수 있으므로 두 개 이상의 행을 업데이트합니다. 먼저 업데이트하기 전에 아무것도 발견하지 못해서 행을 잠근 다음 데이터가 트랜잭션과 일치하는지 확인합니다.

이것이 바로 트랜잭션을 사용하려는 이유입니다. 한 행에 쓰기가 잘못되면 금융 거래 데이터가 일관성없이 끝나지 않고 전체 업데이트를 롤백 할 수 있습니다.


하나의 트랜잭션과 두 개의 작업 (예 : 하나는 $ 5,000을 지불하고 두 번째는 $ 5,000을 받음)의 문제는 동일한 우선 순위를 가진 두 개의 계정이 모든 것입니다. 하나의 계정을 사용하여 두 번째 (또는 역순)를 확인할 수 없습니다. 이 경우 하나의 계정 만 확인하고 (확인 된) 두 번째 계정 (확인)이 실패 할 수 있음을 보장 할 수 있습니다. 실패 할 수있는 이유를 보겠습니다 (aproatch 사용, 보낸 사람이받는 사람에 의해 확인 됨).

  1. 담당자 계정에 + $ 5,000 쓰기
  2. 성공한 경우-보낸 사람 계정에-$ 5,000 쓰기
  3. 실패하면 다시 시도하거나 취소하거나 메시지를 표시합니다.

# 1에 대한 저장을 보장합니다. 그러나 # 2가 실패하면 누가 보증 할 수 있습니까? 역순도 마찬가지입니다.

그러나 트랜잭션없이 NoSQL을 사용하여 구현할 수 있습니다. 발신자와 계약 측에서 확인하고 작업이 수행 보증하는 세 번째 서비스를 항상 사용할 수 있습니다.

  1. 고유 한 트랜잭션 ID 생성 및 트랜잭션 개체 생성
  2. 거래 계정에 + $ 5,000 쓰기 (거래 ID 참조)
  3. 성공하면-전송할 트랜잭션 상태 설정
  4. sedned 계정 계정에-$ 5,000 쓰기 (거래 ID 참조)
  5. 성공하면 수신 할 트랜잭션 상태 설정

이 거래 기록은 마사지 보내기 / 받기에 문제가 없음을 보증합니다. 이제 트랜잭션 ID로 모든 메시지를 확인할 수 있고 상태가 수신 또는 완료되었는지 확인할 수 있습니다. 사용자 잔액을 고려합니다.


DB에 따라 다르지만 ... 일반적으로 '낙관적 트랜잭션'사용 하여이를 달성 할 수 있지만 데이터베이스 구현의 원 자성 보장 (예 : 어떤 종류의 쓰기 및 읽기 작업이 원 자성 인지 이해해야 함)을 반드시 이해해야한다고 생각합니다. ).

있는 것으로 보인다 그물에 약간의 토론 에 대한 HBase와의 그게 만약 어떤 도움, 거래.


SQL DB에서 항상 NoSQL 접근 방식을 사용할 수 있습니다. NoSQL은 일반적으로 "키 / 값 데이터 저장소"를 사용하는 것 같습니다. 선호하는 RDBMS에서 항상이를 구현할 수 있으므로 트랜잭션, ACID 속성, 친숙한 DBA의 지원 등과 같은 좋은 항목을 유지하면서 NoSQL 성능 및 유연성 이점을 실현할 수 있습니다. , 예를 들어 다음과 같은 테이블을 통해

CREATE TABLE MY_KEY_VALUE_DATA
(
    id_content INTEGER PRIMARY KEY,
    b_content  BLOB
);

보너스는 여기에 추가 필드를 추가하여 콘텐츠를 다른 적절한 관계형 테이블에 연결하는 동시에 부피가 큰 콘텐츠를 기본 BLOB (또는 적절한 경우 TEXT) 필드에 유지하는 것입니다.

개인적으로 저는 TEXT 표현을 선호하므로 데이터 작업을위한 언어에 묶여 있지 않습니다. 예를 들어 직렬화 된 Java를 사용하면보고를 위해 Perl에서 콘텐츠에 액세스 할 수 있습니다. TEXT는 디버그하기가 더 쉽고 일반적으로 개발자와 함께 작업합니다.


강력한 일관성과 구현 된 트랜잭션을 가진 SQL DB가없는 scalaris를 살펴보십시오.


이것이 제가 비정형 데이터 접근 방식의 힘으로 엔터프라이즈 애플리케이션에서 "실제"트랜잭션을 사용할 수있는 NoSQL 문서 저장소 솔루션을 만드는 이유입니다. http://djondb.com을 살펴보고 유용하다고 생각되는 기능을 자유롭게 추가하십시오.


확실히 다른 사람들이 있습니다


비교 및 설정을 지원하는 경우 NoSQL 솔루션 위에 낙관적 트랜잭션을 구현할 수 있습니다. MongoDB에서 수행하는 방법 에 대한 예제와 설명을 GitHub 페이지에 작성했지만 적절한 NoSQL 솔루션에서 반복 할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/2212230/transactions-in-nosql

반응형