문제

데이터베이스에 대한 대안을 확장하기 위해 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은 트랜잭션이있는 RDBM이 Timmy와 저의 요구에 충분할 것입니다. 그럼에도 불구하고 오픈 소스 도구와 방법이라는 방법으로 NOSQL 데이터베이스를 얼마나 멀리 가져갈 수 있는지 보는 것은 재미있을 것입니다. "라조 블레이드의 토네이도".

NOSQL 키 값, 문서, 그래프 및 넓은 열 상점을 포함하여 다양한 도구 및 서비스 세트를 다룹니다. 일반적으로 데이터 스토어의 확장 성을 개선하려고합니다. 일반적으로 데이터 처리를 배포함으로써. 거래가 필요합니다 DBS가 사용자 작업을 수행하는 방법의 속성. 산은 확장 성이 향상 될 수있는 방법을 제한합니다. 대부분의 NOSQL 도구는 Operatioin의 일관성 기준을 완화하여 결함이 강하고 스케일링의 가용성을 얻으므로 산 트랜잭션을 구현하기가 매우 어렵습니다.

분산 데이터 저장소의 일반적으로 인용되는 이론적 추론은 다음과 같습니다. 캡 정리: 일관성, 가용성 및 파티션 공차는 동시에 달성 할 수 없습니다. SQL, NOSQL 및 NewsQL 도구는 포기한 것에 따라 분류 할 수 있습니다. 좋은 인물이 발견 될 수 있습니다 여기.

산을 대체하는 새롭고 약한 요구 사항은 베이스 ( "기본적으로 발전 가능하고 부드러운 상태, 최종 일관성"). 그러나 결국 일관된 도구 ( "결국 항목에 대한 모든 액세스는 마지막 업데이트 된 값을 반환합니다")는 뱅킹과 같은 거래 응용 프로그램에서는 거의 허용되지 않습니다. 예를 들어 메모리, 열 지향 및 분산 SQL/Acid 데이터베이스를 사용하는 것이 좋습니다. voltdb; 이 "NewsQL"솔루션을 살펴 보는 것이 좋습니다.

이 스레드에서 돈 거래 조언에 댓글을 달고 싶었습니다. 거래는 돈 이송과 함께 실제로 사용하고 싶은 것입니다.

전송이 어떻게 Que가 매우 멋지고 깔끔한 지에 대한 예가.

그러나 실생활에서 돈을 이체하는 데는 다른 계좌에 대한 수수료 또는 지불이 포함될 수 있습니다. 사람들은 다른 계정에서 나오는 특정 카드를 사용하거나 동일한 시스템의 계정에서 다른 계정으로 수수료를받을 수 있습니다. 수수료는 금융 거래에 따라 다를 수 있으며 각 거래의 신용과 직불을 보여주는 부기 시스템을 유지해야 할 수도 있습니다.

즉, 한 계정의 크레딧이 하나 이상의 계정에서 차변 될 수 있으므로 동시에 두 행 이상을 업데이트 할 수 있습니다. 먼저 행을 잠그므로 업데이트 전에 아무것도 변경할 수 없습니다. 그런 다음 데이터가 트랜잭션과 일치하는지 확인하십시오.

그렇기 때문에 거래를 정말로 사용하고 싶어합니다. 한 행에 잘못된 글을 쓰면 금융 거래 데이터가 일관되지 않고 전체 업데이트를 롤백 할 수 있습니다.

하나의 거래와 2 개의 운영 문제 (예 : 1 달러를 지불하고, 두 번째는 $ 5,000를받습니다) - 동일한 우선 순위가있는 두 개의 계정이 있다는 것입니다. 하나의 계정을 사용하여 두 번째 (또는 역 순서)를 확인할 수 없습니다. 이 경우 하나의 계정 만 올바르게 보증 할 수 있습니다 (확인). 두 번째 (확인)가 실패했을 수 있습니다. 실패 할 수있는 이유를 살펴 보겠습니다 (메시지 APROATCH를 사용하여 발신자가 수신자가 확인합니다) :

  1. 수신자 계정에 +$ 5,000을 쓰십시오
  2. 성공 경우 - 쓰기 - 발신자 계정에 $ 5,000
  3. 실패한 경우 - 다시 시도하거나 취소하거나 메시지를 표시합니다.

#1에 대한 저장을 보장합니다. 그러나 #2가 실패하면 누가 보증합니까? 역 차수에 대해서도 동일합니다.

그러나 이것은 거래와 NOSQL없이 안전하다고 구현할 수 있습니다. 귀하는 항상 발신자 및 수신자로부터 확인 될 제 3 기관을 사용할 수 있으며 작업이 수행되었다고 보장합니다.

  1. 고유 한 트랜잭션 ID 생성 및 트랜잭션 엔티티 생성
  2. 수신자 계정에 +$ 5,000 작성 (거래 ID 참조)
  3. 성공 인 경우 - 거래 상태를 보내도록 설정하십시오
  4. 쓰기 -SEDNED 계정에 $ 5,000 (거래 ID 참조)
  5. 성공 경우 - 거래 상태를 수신하도록 설정하십시오

이 거래 기록은 보내기/수신 마사지에 적합하다는 것을 보장 할 것입니다. 이제 트랜잭션 ID로 모든 메시지를 확인할 수 있으며 상태가 수신되거나 완료된 경우 사용자 균형을 고려하여 사용합니다.

DB에 따라 다르지만 ... 일반적으로 말할 수 있습니다. '낙관적 거래' 이를 달성하려면 데이터베이스 구현을 이해해야한다고 생각합니다. 원자력 보증 (예 : 어떤 종류의 쓰기 및 읽기 작업이 원자인지).

있는 것 같습니다 그물에 대한 일부 토론 ~에 대한 HBASE 도움이 필요한 경우 거래.

SQL DB에서 언제든지 NOSQL 접근 방식을 사용할 수 있습니다. NOSQL은 일반적으로 "키/가치 데이터 저장소"를 사용하는 것 같습니다. 언제든지 선호하는 RDBM에서이를 구현할 수 있으므로 NOSQL 성능 및 유연성 이점을 실현하면서 트랜잭션, 산성 특성, 친근한 DBA의 지원 등을 유지할 수 있습니다. , 예를 들어,와 같은 테이블을 통해

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

보너스는 여기에 추가 필드를 추가하여 콘텐츠를 다른 관계형 테이블에 연결하는 동시에 메인 블로브 (또는 APT) 필드에 부피가 큰 콘텐츠를 유지할 수 있다는 것입니다.

개인적으로 나는 텍스트 표현을 선호하므로 데이터로 작업하기위한 언어로 연결되어 있지 않습니다. 예를 들어 직렬화 된 Java를 사용하면보고를 위해 Perl의 컨텐츠에 액세스 할 수 있음을 의미합니다. 텍스트는 또한 디버깅하기 쉽고 일반적으로 개발자로 작업합니다.

Scalaris를 살펴보십시오.

그렇기 때문에 구조화되지 않은 데이터 접근법의 힘으로 엔터프라이즈 애플리케이션에서 "실제"트랜잭션을 사용할 수있는 NOSQL Document Store 솔루션을 작성하는 이유입니다. 보세요 http://djondb.com 그리고 유용 할 수 있다고 생각하는 기능을 자유롭게 추가하십시오.

분명히 다른 사람들이 있습니다

비교 및 세트를 지원하는 경우 NOSQL 솔루션 위에서 낙관적 인 트랜잭션을 구현할 수 있습니다. 나는 예제와 설명을 썼다 github 페이지 MongoDB에서 수행하는 방법이지만 적절한 NOSQL 솔루션에서 반복 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top