2009-11-25 8 views
3

해시에 24 개의 항목이있는 간단한 응용 프로그램을 작성하여 프로그램 실행간에 일관되게 유지할 수 있으므로 Berkeley DB (DBM)가이 작업에 적합해야합니다.Berkeley DB 사용량은 얼마나 비쌉니까?

그리고 그것은 단지 재미를위한 것입니다.

하지만 루비와 함께 사용한다면, 사용자가 CTRL-C를 누르면 실행이 중단됩니다. 이 경우 데이터가 엉망이 될 수 있습니까? DB의 값이 63이고, I는 1로 증가하는 경우

예를 들어, CTRL-C는 "가장 현저한"1 인 오른쪽 때 발생할 수 있으므로

63 = 111111 (in binary) 
64 = 1000000 (in binary) 

(64 될) 서면하지만 0은 쓰여지지 않았습니까? 이 경우 DB의 값은 63 또는 64 대신 127이됩니다. Ruby가 아니고 C에서 사용자가 "닫기 창"또는 "kill"을 사용하여 프로세스를 종료하면 어떻게됩니까? 생각해 보니, 하드 드라이브는 아마도이 바이트 (또는 4 바이트)를 하드 디스크 표면에 한꺼번에 기록하므로 아마 이런 일은 일어나지 않아야합니다.

CTRL-C가이 문제를 일으키지 않으면 전원이 중단되거나 전원 플러그가 누출되면이 문제가 발생할 수 있습니까? 예를 들어 값이 RAM에 처음 캐시되고 하드 디스크에 쓰여지는 동안 전원 플러그가 차고 0이 기록되기 전에 하드 드라이브의 전원이 꺼집니다. 나는 백만 번에 하나를 알고, 이것은 일어나지 않을 것이다. 그러나 이것은 단지 호기심의 문제 일 뿐이다. 내 스크립트가

  1. 감소시킵니다 동전 값의 경우 사용자가 CTRL-를 누르면 한편

그의 목록에서 사용자에게 "햄버거"를 부여 C, 그리고 위의 (1)과 (2) 사이에서 발생하면 사용자는 동전이 적어지고 햄버거를 얻지 못합니다.

이러한 모든 일이 일어나지 않도록하려면 SleepyCat, SQLite 또는 MySQL을 사용하는 트랜잭션 방식을 사용하는 것이 좋을 것입니까?

답변

2

좋은 데이터베이스 시스템 (Berkley DB가 포함 된 카테고리)은 부분적으로 업데이트 된 값으로 제안 된 방식대로 중단 될 수 없습니다. control-c를 누르면 CPU 중간 명령을 인터럽트 할 수 없습니다. 인터럽트에는 일정 수준의 세밀도가 존재하며 잘 작성된 데이터베이스는 일관성없는 상태에있는 데이터베이스를 보호하기 위해이 사실을 이용합니다.

전원이 꺼지면 데이터 손상 및 손실의 가능성이 있지만 데이터 유실 또는 손상 여부에 대한 세부 사항은 데이터베이스 파일이 저장된 파일 시스템과 관련이 있습니다. 예를 들어 좋은 저널링 파일 시스템은 "저널"에서 수행 할 작업을 기록한 다음 저널에서 저널에 기록합니다. 예를 들어, 쓰기 작업 중에 전원이 끊어지면 파일 시스템에 액세스 할 수있게하기 전에 끝내야 할 것이 있는지 일지에서 확인합니다. 이것은 지나치게 단순화되었지만 예를 들어 위키 백과에서 ext3을 체크 아웃하여 세부 정보를 얻을 수 있습니다.

관련 문제