원자성 (데이터베이스 시스템)

원자성(atomicity)은 데이터베이스 시스템에서 ACID 트랜잭션 특성 중의 하나다. 하나의 원자 트랜잭션은 모두 성공하거나 또는 실패하는 데이터베이스 운용의 집합이다. 원자성의 보증은 데이터베이스의 부분적인 갱신으로 더 큰 문제가 야기되는 것을 방지한다.

항공 티켓 주문이 원자성의 한 예다. 티켓은 반드시 지불과 예약이 동시에 되거나 아니면 모두 되지 않아야 한다. 성공적으로 지불은 되었으나 좌석 예약은 되지 않은 경우는 허용되지 않는다. 하나의 트랜잭션은 항공 티켓 예약뿐 아니라 호텔, 운송, 현재 환율로 정확히 환전되는 데에도 적용된다.

직교성편집

원자성은 다른 ACID 트랜잭션 특성과 완전히 직교하지 않는다. 예를 들어, 고립성은 교착상태와 같은 고립 실패 상태에서 롤백하기 위해서 원자성에 의존한다. 일관성 또한 잘못된 트랜잭션에 의해 일관성 위배 상태에서 롤백에 의존한다. 마지막으로 트랜잭션이 외부 요인에 의한 실패에 대해 원자성을 보장하기 위해 영구성에 의존한다. 결과적으로, 오류 감지를 실패하거나 트랜잭션을 수동으로 롤백하는 것은 고립성과 일관성 실패를 야기할 수 있다.

구현편집

전통적으로, 원자성은 트랜잭션이 시작되고 종료되었는지를 알려주는 메커니즘과 변경 전, 후 데이터의 복사본을 보존하는 것에 의해 실행된다. 몇몇 파일 시스템은 저널링(journaling)을 이용해 여러 본의 데이터 복사본의 저장을 회피하는 방법들을 개발해 왔다. 많은 데이터베이스는 원자성 실행을 돕기 위해 또한 커밋-롤백 메커니즘을 지원한다. 또, 변경을 트래킹할 수 있는 로깅/저널링 형태를 사용한다. 로그는 실제 변경이 성공적으로 이뤄질 때마다 동기화 된다. 시스템 충돌로부터 복구시, 저장되지 않은 내용은 무시된다. 병행제어 이슈, 원자성의 원칙 (즉, 완전한 성공 또는 완전한 실패) 에 따라 원자성은 다양하게 구현된다.

궁극적으로, 어떤 애플리케이션 레벨의 구현은 운영체제 기능에 의존한다. 여기서 운영체제는 시스템 자원을 다시 전환하려는 다른 소프트웨어나 자원을 이용할 수 없는 상태가 발생(예. 전원 정지)에 대비해 전문화된 하드웨어를 차례로 사용한다. (pre-emptive multitasking)

예를 들면, POSIX 호환 시스템은 애플리케이션이 단독으로 하나의 파일을 사용할 수 있도록 시스템 콜 open(2)을 제공한다. 원자성을 제공하기 위해 다른 널리 사용되는 시스템 콜은 mkdir(2), flock(2), fcntl(2), rasctl(2) (NetBSD restartable sequences), semop(2), sem_wait(2), sem_post(2), fdatasync(2), fsync(2) 그리고 rename(2) 등이 있다.

하드웨어 레벨에서, test-and-set(TAS) 같은 원자적 운용과 원자적 증가/감소 기능이 필요하다. 이런 기능이 없거나 필요할 때, 모든 가능한 하드웨어나 소프트웨어의 인터럽트를 불가능하게 인터럽트 레벨을 증가시켜 원자적 동기화 구현에 사용될 수 있다. 이런 하위 레벨 동작은 때로는 기계어어셈블리어에 의해 수행된다.

'Atom'의 어원은 '기초적이고 나눌 수 없는 요소'란 의미로, 고대 그리스어에서 기원한다.