데이터베이스의 데이터 항목들에 접근하고 업데이트하는 프로그램 실행 단위

A에서 B로의 계좌이체를 가정해보자
고려해야 할 점은 다양한 하드웨어 고장, 시스템 충돌 , 여러 트랜잭션의 동시 충돌등이 생길 수 있다.
이러한 충돌 상황은 ACID 를 잘 충족함을 통해 해결할 수 있다
Transaction 에서 반드시 지켜져야 할 원칙이다.
트랜잭션의 모든 연산이 완전히 반영되거나 전혀 반영되지 않아야 한다.
트랜잭션 실행 후에도 데이터베이스가 일관된 상태를 유지해야 한다
동시 실행중인 다른 트랜잭션들로부터 독립적으로 실행되는 것처럼 보여야 한다
(중간 결과가 다른 트랜잭션에 보이면 안된다)
완료된 트랜잭션의 결과는 시스템 고장이 있어도 영구적으로 유지한다
데이터베이스 시스템(DBMS)에서 Transaction 을 자동으로 관리하고 추적한다.
트랜잭션 상태는 직접 지정하는 것이 아니라, DBMS가 트랜잭션의 진행 상황에 따라 트랜잭션 상태를 자동으로 변경하고 확인할 수 있도록 해준다

트랜잭션이 현재 실행 중인 상태. 트랜잭션은 여러 명령문을 처리하고 있으며, 아직 종료되지 않았습니다.
트랜잭션의 마지막 명령문이 성공적으로 실행되었지만, 아직 완전히 커밋되지 않은 상태. 일반적으로 트랜잭션이 모든 작업을 마친 후, 커밋하기 전의 상태입니다.
트랜잭션이 성공적으로 완료된 상태. 모든 작업이 완료되고 영구적으로 데이터베이스에 반영되었습니다. 이 상태에서 트랜잭션은 더 이상 변경이 불가능합니다.
트랜잭션이 정상적으로 실행할 수 없는 상태가 발견된 경우. 예를 들어, 트랜잭션 도중 오류나 예외가 발생하면 이 상태로 전환됩니다. 이후 트랜잭션은 Rollback(롤백) 절차를 통해 복구됩니다.
트랜잭션이 롤백 완료된 상태. 실패하거나 사용자 요청에 의해 중단된 경우, 트랜잭션은 롤백되어 데이터베이스를 원래 상태로 복원합니다.
대기 상태는 트랜잭션이 잠금이나 자원 할당을 기다리고 있는 상태입니다. 예를 들어, 다른 트랜잭션이 데이터를 잠그고 있을 때 해당 트랜잭션은 자원을 기다리며 대기 상태로 전환됩니다.
대기 중인 상태와 비슷하지만, 차단된 상태는 트랜잭션이 더 이상 진행할 수 없는 상태를 의미합니다. 보통 교착 상태(Deadlock)에 의해 차단됩니다. 예를 들어, 두 트랜잭션이 서로의 자원을 기다리며 무한히 대기하는 경우입니다.
이제 트랜잭션을 하나가 아닌 다중 트랜잭션을 다루는 것을 알아보자
동시 실행되는 트랜잭션들의 명령어 실행 순서

T1 , T2 는 동시에 발생할 수도 있고 아닐 수도 있다.
T1이 read(A) 후 A = 100이라고 가정하고 A := A - 50으로 A = 50으로 설정.
T2가 read(A)를 실행할 때 A = 100이라고 읽고, 그 값에 0.1을 곱하여 temp = 10을 계산.
T2는 그 후 A := A - temp를 실행하여 A = 90으로 Update 한다 .
T1이 write(A)를 실행하여 A = 50이 Update 된다 , B = 50이 더해진다.
-> 그럼 3에서한 T2는 ?? 없던 일이 된다
T2는 write(B)를 실행하여 B = B + 10을 수행.
동시성 제어에서 중요한 개념으로, 여러 트랜잭션이 동시에 실행될 때, 그 실행 순서를 직렬화(serialize)할 수 있는지 여부
Serializable 한 Schedule 이 마치 순차적으로 실행된 것처럼 결과적으로 동일한 데이터베이스 상태를 만들어야 한다.
트랜잭션들이 동시성 있게 실행되더라도, 결과적으로 직렬 실행한 것과 동일한 결과를 가져야 한다는 것입니다.
Conflict Serializability는 트랜잭션들이 수행한 연산 중에서 충돌(conflict)이 일어나는 연산들을 기준으로 순서를 결정.

Schedule 3과 Schedule 6의 차이점:
Schedule 3에서 T1과 T2는 번갈아 가며 실행. T1이 A를 읽고, 그 다음 T2가 A를 읽고 쓰고, T1이 B를 읽고, 그 다음 T2가 B를 읽는 식.
이 순서에서는 두 트랜잭션이 동시성 있게 작업을 처리하지만, 충돌(conflict)이 발생할 수 있다.
T1이 A를 쓴 후 T2가 A를 읽을 때, T2는 T1이 업데이트한 A의 값을 읽게 되어 불일치가 발생할 수 있다.
Schedule 6에서는 T1이 A를 읽고 쓰고, B를 읽고 쓰는 작업을 모두 마친 후, T2가 A와 B를 읽고 쓰는 방식.
이 경우, T1과 T2가 각각 전체 작업을 완료한 후 다른 트랜잭션이 진행되기 때문에, 두 트랜잭션 간에 충돌 없이 실행될 수 있다. 이 경우, 데이터 무결성이 더 잘 보장된다.
Schedule 3에서 두 트랜잭션은 동시성을 높이기 위해 교차 실행.
Schedule 6에서 두 트랜잭션은 직렬화 가능하게 순차 실행.
View Serializability는 트랜잭션들이 읽기와 쓰기 연산에 의해 데이터베이스의 상태를 변경하는 방식에 중점을 둔다.
View Equivalent 조건 (3가지):
특징:
1. 모든 conflict serializable 스케줄은 view serializable 이다.
2. 그러나 모든 View Serializable 은 Conflict Serializable 이 아니다.
3. View serializable이지만 conflict serializable이 아닌 경우: blind writes 포함
트랜잭션들이 수행되는 순서에서 데이터 손실이나 불일치 없이, 트랜잭션이 커밋(commit)될 수 있도록 보장하는 스케줄.
특히, 한 트랜잭션이 다른 트랜잭션에서 읽은 데이터에 대해 의존하는 경우, 원래 데이터를 작성한 트랜잭션이 커밋(commit)된 이후에만 해당 트랜잭션이 커밋되는 것이 필수적이다.
Recoverable schedule은 다음 조건을 만족해야 한다:
만약 트랜잭션 Tj가 트랜잭션 Ti가 쓴 데이터를 읽기(read) 한다면, Ti의 커밋이 Tj의 커밋 이전에 발생해야 한다.

그런 의미에서 위 사진의 스케줄은 만약 T8 이 모종의 이유로 abort 가 된다면 T9 은 일관성 없는 데이터들을 읽어 들일수 밖에 없다. 그러므로 , 데이터베이스는 Recoverable 을 보증해야한다.
한 트랜잭션이 실패하여 Rollbcack되면, 그 트랜잭션을 의존하고 있던 다른 트랜잭션들도 자동으로 Rollback되는 상황.

만약 T10 이 실패한다면, T12, T11 , T10 순으로 줄줄이 롤백 (Cascading Rollback) 된다.
Cascading rollback을 방지하는 Schedule. 하나의 트랜잭션이 실패했을 때, 그 트랜잭션을 읽은 다른 트랜잭션들이 롤백되지 않도록 보장하는 Schedule이다. 이는 데이터베이스 시스템에서 신뢰성과 복구 가능성을 보장하는 중요한 특성이다.
트랜잭션들이 서로 어떤 연산을 수행하고, 그 연산들이 어떤 순서로 이루어졌는지를 시각적으로 표현하는데 사용됩니다. 그래프를 통해 트랜잭션의 순서성을 확인할 수 있다.

스케줄이 충돌 직렬화 가능하려면 그 선행 그래프가 사이클이 없어야 한다.
=> 비순환 그래프 (DAG) 형태를 띄어야 한다.
그래프가 비순환적 (DAG) 이면, 트랜잭션들의 순서 관계를 직렬화할 수 있다. 이때 각 트랜잭션들 간의 순서를 정의할 수 있다는 것다.
위상 정렬은 사이클이 없는 방향 그래프에서 노드를 순서대로 배열하는 방법이다. 위상 정렬은 각 노드의 선행 조건을 지키면서, 유효한 순서를 찾아내는 알고리즘이다. 트랜잭션 스케줄에서 위상 정렬을 사용하면, 트랜잭션들이 직렬화 가능한 순서대로 배열된다.