BigData

[SQLite] Sqlite transaction ACID 개념

IT오이시이 2022. 8. 10. 07:33
728x90

[SQLite 사용법] Sqlite transaction ACID 개념

 

SQLite 사용법 관련  목차 

1. [SQLite]-sqlite 소개 -Serverless-Database
2. [SQLite]-SQLite_관리-Commands
3. [SQLite] sqlite 테이블 생성 - create table
4. [SQLite] Sqlite transaction - ACID개념
5. [SQLite] [SQLite] Sqlite transaction 처리문 작성 - BEGIN TRANSACTION
6.[SQLite] date형식 timestamp를 이용하여 날짜 표현하기
7.[SQLite] SQLite 윈도우-리눅스 설치하기

 

데이터 베이스는 동시에 입력, 수정,삭제가 일어나는 경우에도 데이터를 안전하게 처리하여 완전한 데이터 정합성을 갖추도록 결과를 저장하고 관리하는 기능을 제공합니다. 흔히 데이터베이스의 중요한 기능으로 ACID (atomic, consistent, isolated, and durable)를라고 도 하며 데이터의 동시 입력과 수정이 발생하는경우 데드락이나, 데이터 중복을 방지 하기 위한 기술입니다.

1. SQLite 과 ACID 개요


SQLite는 모든 변경 사항과 쿼리가 원자성(Atomic), 일관성(consistent), 고립성(isolation,격리) 및 내구성 (durable) 등 ACID를 제공하는 트랜잭션 데이터베이스입니다.

SQLite는 프로그램 충돌, 운영 체제 덤프 또는 컴퓨터 정전으로 인해 트랜잭션이 중단된 경우에도 모든 트랜잭션이 ACID를 준수함을 보장합니다.

 

Atomic(원자성):

SQLite에서는 트랜잭션(Transaction) 단위로 작업이 수행됩니다. 트랜잭션은 데이터 변경은 모두 성공하거나 또는 실패하는 데이터베이스 운용의 집합 단위입니다.

트랜잭션은 여러 개의 쿼리(Query)를 묶어서 실행하는 것으로, 모든 쿼리가 성공적으로 완료되거나, 모두 실패하는 것을 보장합니다. 즉 트랜잭션을 커밋하면 전체 트랜잭션이 적용되거나 일부만 적용되지 않는것이 아니라 commit이 필요한 대상은 모두 성공하거나 모두 실패 해야 하는 대상 범위라고 이해 하면 좋을듯 합니다.

예를 들어, 계좌 이체를 위한 트랜잭션에서 송금과 수금 쿼리가 있을 때, 송금 쿼리가 실패하면 수금 쿼리도 실행되지 않고, 이체 전 상태로 롤백(Rollback)됩니다.



Consistent(일관성):

 "일관성(Consistency)"은 데이터베이스에서 정의된 규칙과 제약 조건을 항상 만족해야 함을 의미합니다.

SQLite에서는 이러한 일관성 위반을 방지하기 위해 데이터베이스의 트랜잭션(Transaction) 기능을 제공합니다. 트랜잭션은 여러 개의 데이터 조작 명령어(INSERT, UPDATE, DELETE 등)를 하나의 작업 단위로 묶어서 실행하는 것입니다. 이때 트랜잭션 내에서 어떤 하나의 명령어라도 실패하면, 전체 작업이 롤백되어 이전 상태로 복구됩니다.

예를 들어, 학생 정보를 저장하는 데이터베이스에서 "성적" 필드는 0~100점까지의 범위에서만 입력될 수 있다는 제약 조건이 있다고 가정해 봅시다. 만약 어떤 이유로 인해 이 제약 조건을 어긴 데이터가 데이터베이스에 입력되면, 이는 데이터베이스의 일관성을 깨뜨리게 됩니다.

이와같이 일관성은  SQL이 실행되는 트랜잭션이 성공적으로 완료하면 언제나 일관성 있는 데이터베이스의 관리 정책을 준수하고 유지 할수 있도록 하는 것입니다.

트랜잭션이 시작되고 데이터를 수정하는 여러 사람이 명령문을 실행하여 커밋되거나 롤백될 때 트랜잭션이 데이터베이스에 적용되는 일정한 규칙으로 정확한 값의 유지와 누락없는 데이터 처리의 정합성은 일관성을 유지해야 하는 것이 매우 중요합니다.

이러한 일관성을 유지하기 위해서 SQLite는 다음과 같은 기능을 제공합니다.

1) 제약 조건(Constraint) 기능:

SQLite에서는 데이터베이스의 테이블에 제약 조건을 설정할 수 있습니다. 예를 들어, 어떤 필드의 값이 NULL일 수 없다는 제약 조건을 설정할 수 있습니다. 이러한 제약 조건은 데이터베이스의 일관성을 유지하는 데 도움을 줍니다.

무결성 제약의 예로는 모든 계좌는 잔고가 있어야 한다면 이를 위반하는 트랜잭션은 중단되도록 합니다. (즉 제약 조건을 통해서 null값이 오거나 너무 적은 값, 숫자 영역에 문자가 입력되는 경우등에서  데이터 오류를 방지를 할 수 있습니다)

또 트랜잭션이 시작되고 데이터를 수정하는 여러 사람이 명령문을 실행하여 커밋되거나 롤백될 때 트랜잭션이 데이터베이스에 적용되는 일정한 규칙으로 정확한 값의 유지와 누락없는 데이터 처리의 정합성은 일관성을 유지해야 하는 것이 매우 중요합니다.


Isolation(고립성,격리):

SQLite에서 격리(Isolation)는 여러 개의 트랜잭션이 동시에 실행될 때 각각의 트랜잭션이 서로 영향을 미치지 않도록 보장하는 것을 의미합니다. 격리 수준은 트랜잭션 간의 상호작용 수준을 결정합니다. SQLite는 격리 수준을 지정할 수 있는 기능은 제공하지 않으며 기본적으로 Serializable 수준을 사용합니다.

여러 세션에서 동시수행하는 트랜잭션은  보류 중인 다른 세션과 서로 격리되어야 합니다. 세션이 트랜잭션을 시작하고 INSERT또는 UPDATE문을 실행하여 데이터를 변경하면 이러한 변경 사항은 현재 세션에만 표시되고 다른 세션에는 표시되지 않도록 합니다.  반면에 트랜잭션이 시작된 후 다른 세션에서 커밋된 변경 사항은 현재 세션에서 볼 수 없도록 합니다.

Serializable 수준에서는 트랜잭션의 각 단계마다 데이터베이스의 일관성이 유지됩니다. 즉, 여러 트랜잭션이 동시에 실행될 때도 트랜잭션 간에 서로 영향을 미치지 않으며, 각 트랜잭션은 마치 순차적으로 실행되는 것처럼 동작합니다. 이를 보장하기 위해 SQLite에서는 공유 락(shared lock)과 배타적 락(exclusive lock)이라는 락(Lock) 메커니즘을 사용합니다.

예를 들어, 트랜잭션 A가 특정 행을 읽고 수정하는 동안, 다른 트랜잭션 B는 동일한 행을 동시에 수정할 수 없으며, 해당 행에 대한 공유 락이 설정됩니다. 이후에 트랜잭션 A가 커밋되면 해당 행에 대한 배타적 락이 설정되어 트랜잭션 B는 해당 행에 대한 작업을 수행할 수 있게 됩니다.

흔히 동시 처리의 격리를 위한 정책으로 각 데이터 베이스는 다음 과 같은 isolation level을 갖추고 있습니다.

  • READ UNCOMMITTED(커밋되지 않은 읽기)
  • READ COMMITTED(커밋된 읽기)
  • REPEATABLE READ(반복 가능한 읽기)
  • SERIALIZABLE(직렬화 가능)
(동시성의 문제 해결) 모든 데이터가 입력되는 순간 모든 사용자가 조회를 하거나 조회 할수 없도록 해야 하는 상황들이 있기 때문에 다양한 상황에 따른 조치가 필요하고 대량의 데이터 처리를 하면서 발생하는 동시성의 문제를 해결하기 위해서 만든 기술적 대안으로 선택을 해야 합니다.


지속성(durable):

트랜잭션이 성공적으로 커밋되면 정전이나 프로그램 충돌과 같은 조건에 관계없이 변경 사항이 데이터베이스에 영구적이어야 합니다. 반대로 트랜잭션이 커밋되기 전에 프로그램이 충돌하면 변경 사항이 지속되지 않도록 하여야 합니다.

 

구분 내용
Atomicity (원자성) 트랜잭션의 작업이 부분적으로 실행되거나 중단되지 않는 것을 보장하는 것
- 트랜잭션은 분해가 불가능한 최소의 단위로서 연산 전체가 처리되거나 전체가 처리되지 않아야 함(All or Nothing)
- Commit, Rollback 연산, 트랜잭션관리
Consistency(일관성) 트랜잭션이 성공적으로 완료되면 일관적인 DB상태를 유지하는 것
- 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태를 보존함
- DBMS의 무결성 제약조건
Isolation (고립성) 트랜잭션 수행시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장
- 트랜잭션이 실행 중에 생성하는 연산의 중간 결과를 다른 트랜잭션이 접근할 수 없음
- 동시성제어
Durability (영속성) 성공적으로 수행된 트랜잭션은 영원히 반영이 되는 것
- 성공이 완료된 트랜잭션의 결과는 영구()적으로 저장됨
- Recovery관리

출처: https://couplewith.tistory.com/entry/Graph-DB-와-RDBMS-트랜드-1부-DBMS의-역사와-이론들 [IT 내공을 써먹자.:티스토리]

 

 

SQLite 사용법 관련  목차 

1. [SQLite]-sqlite 소개 -Serverless-Database
2. [SQLite]-SQLite_관리-Commands
3. [SQLite] sqlite 테이블 생성 - create table
4. [SQLite] Sqlite transaction - ACID개념
5. [SQLite] [SQLite] Sqlite transaction 처리문 작성 - BEGIN TRANSACTION
6.[SQLite] date형식 timestamp를 이용하여 날짜 표현하기
7.[SQLite] SQLite 윈도우-리눅스 설치하기

 

 

참고 문헌 

1. Graph-DB-와-RDBMS-트랜드-1부-DBMS의-역사와-이론들

728x90
반응형