2012-04-01 6 views
1

저는 데이터베이스 응용 프로그램에 익숙하지 않으며 Datamapper를 사용하여 루비 웹 응용 프로그램을 만들려고합니다.데이터베이스의 트랜잭션에 대한 이해

transaction do |txn| 
    link = Link.new(:identifier => custom) 
    link.url = Url.create(:original => original) 
    link.save 
end 

을 나는 몇 가지 질문이 있습니다 :

은 내가 이해할 수없는 코드의이 조각을 우연히 발견 정확히 거래는 무엇입니까? 그리고 왜 이렇게하는 것이 좋을까요?

link = Link.new(:identifier => custom) 
link.url = Url.create(:original => original) 
link.save 

언제 거래를 사용해야합니까? 가장 좋은 사용 사례는 무엇입니까? 그러한 개념에 대해 더 많이 읽을 수있는 온라인 리소스가 있습니까?

감사합니다.

답변

3

트랜잭션은 분할 할 수없는 작업 단위입니다. 이 아이디어는 데이터베이스 세계에서 나왔고 데이터 선택/업데이트 문제와 관련이 있습니다. 다음 상황을 고려하십시오.

  1. 사용자 A는 오브젝트 O를 변경하도록 요청합니다.
  2. A가 자신의 작업을 수행하는 동안 사용자 B가 동일한 개체를 요청했습니다. 현재 Object O는 두 사용자가 동일합니다.
  3. 그런 다음 A는 O1 속성을 개체 O로 변경하여 데이터베이스에 대한 업데이트를 적용합니다. 사용자 B에게는 변경 사항이 없습니다. 개체 O도 이전과 동일합니다.
  4. B는 변경된 속성 O2를 가진 데이터베이스에 대한 업데이트를 개체 O에 넣습니다. O1 로의 변경은 효과적으로 손실됩니다.

기본적으로 다중 사용자 액세스 및 변경과 관련되어 있습니다. 몇 가지 문제가 발생합니다.

트랜 잭 션은 다른 조작을 하나의 논리 처리 명령문으로 결합하는 데에도 사용됩니다. 예를 들어, 관련된 모든 사진이있는 사용자를 삭제해야합니다.

주제가 한 게시물에서 다루는 것은 너무 방대하므로 다음의 기사를 읽어 보시기 바랍니다 : wiki#1wiki#2.

+0

+1 좋은 설명입니다. 거래가 사용되는 경우 동일한 상황에서 어떤 일이 발생하는지 분명히 할 수 있습니까? 트랜잭션이 진행되는 동안 사용자 B가 객체 O에 전혀 액세스 할 수 없도록 트랜잭션이 행을 잠급니까? 난 그냥 궁금해서 ... –

+0

구현의 숫자가 있지만 기본적으로 예 - 작업이 완료 될 때까지 행/테이블/데이터베이스가 잠긴다. 실제로 여러 수준의 격리가 있습니다. http://en.wikipedia.org/wiki/Isolation_(database_systems) –

+0

감사합니다. Wiki 링크를 읽고 학습했습니다. –

1

트랜잭션은 실행시 하나의 원자 적 명령어로 간주되는 일련의 명령어입니다.

이것은 트랜잭션이 성공하려면 모든 명령이 성공해야 함을 의미합니다. 그 중 하나만 실패하면 거래 시작 전 상태로 돌아옵니다. 예를 들어 내결함성이 좋은 경우입니다.

트랜잭션이 유용한 다른 필드는 동시 응용 프로그램입니다. 트랜잭션을 사용하면 다른 프로세스의 간섭을 피할 수 있습니다.

희망이 도움이됩니다.