READ UNCOMMITTED
T1으로 인해 변경된 내용을 커밋과 롤백 여부에 상관 없이
T2에서 읽을 수 있다.
READ UNCOMMITTED

사용자A
BEGIN

사용자B
디스크 (데이터 파일)
메모리 (버퍼)
메모리 (UNDO 로그)
| emp_no | first_name |
|---|---|
| 49999 | Francesca |
READ UNCOMMITTED

사용자A
BEGIN

사용자B
INSERT(Lara)
디스크 (데이터 파일)
메모리 (버퍼)
메모리 (UNDO 로그)
| emp_no | first_name |
|---|---|
| 49999 | Francesca |
| 50000 | Lara |
READ UNCOMMITTED

사용자A
BEGIN

사용자B
INSERT(Lara)
SELECT
WHERE emp_no=50000
디스크 (데이터 파일)
메모리 (버퍼)
메모리 (UNDO 로그)
Lara
| emp_no | first_name |
|---|---|
| 49999 | Francesca |
| 50000 | Lara |
READ UNCOMMITTED

사용자A
BEGIN

사용자B
INSERT(Lara)
SELECT
WHERE emp_no=50000
COMMIT(Lara)
디스크 (데이터 파일)
메모리 (버퍼)
메모리 (UNDO 로그)
| emp_no | first_name |
|---|---|
| 49999 | Francesca |
| 50000 | Lara |
READ UNCOMMITTED
↓
Dirty Read

사용자A
BEGIN

사용자B
SELECT
WHERE emp_no=50000
INSERT(Lara)
ROLLBACK
디스크 (데이터 파일)
메모리 (버퍼)
메모리 (UNDO 로그)
Lara
| emp_no | first_name |
|---|---|
| 49999 | Francesca |
READ COMMITTED
T1으로 변경된 내용을 커밋되기 전까지 T2에서 조회할 수 없다.
READ COMMITTED

사용자A
BEGIN

사용자B
디스크 (데이터 파일)
메모리 (버퍼)
메모리 (UNDO 로그)
| emp_no | first_name |
|---|---|
| 49999 | Francesca |
| 50000 | Lara |
READ COMMITTED

사용자A
BEGIN
UPDATE
SET first_name='Toto'

사용자B
디스크 (데이터 파일)
메모리 (버퍼)
| emp_no | first_name |
|---|---|
| 50000 | Lara |
메모리 (UNDO 로그)
| emp_no | first_name |
|---|---|
| 50000 | Toto |
| emp_no | first_name |
|---|---|
| 49999 | Francesca |
| 50000 | Lara |
READ COMMITTED

사용자A
디스크 (데이터 파일)
메모리 (버퍼)
| emp_no | first_name |
|---|---|
| 50000 | Lara |
BEGIN
UPDATE
SET first_name='Toto'

사용자B
SELECT
WHERE emp_no=50000
메모리 (UNDO 로그)
| emp_no | first_name |
|---|---|
| 50000 | Toto |
| emp_no | first_name |
|---|---|
| 49999 | Francesca |
| 50000 | Lara |
Lara
READ COMMITTED

사용자A
BEGIN
UPDATE
SET first_name='Toto'
COMMIT(Toto)

사용자B
SELECT
WHERE emp_no=50000
디스크 (데이터 파일)
메모리 (버퍼)
| emp_no | first_name |
|---|---|
| 50000 | Lara |
메모리 (UNDO 로그)
| emp_no | first_name |
|---|---|
| 49999 | Francesca |
| 50000 | Toto |
READ COMMITTED

사용자A
BEGIN
UPDATE
SET first_name='Toto'
COMMIT(Toto)

사용자B
SELECT
WHERE emp_no=50000
디스크 (데이터 파일)
메모리 (버퍼)
메모리 (UNDO 로그)
| emp_no | first_name |
|---|---|
| 49999 | Francesca |
| 50000 | Toto |

사용자A
BEGIN

사용자B
SELECT
WHERE first_name='Toto'
READ COMMITTED
↓
NON-REPEATABLE READ
디스크 (데이터 파일)
메모리 (버퍼)
메모리 (UNDO 로그)
| emp_no | first_name |
|---|---|
| 49999 | Francesca |
| 50000 | Lara |

사용자A
BEGIN

사용자B
BEGIN
UPDATE
SET first_name='Toto'
SELECT
WHERE first_name='Toto'
READ COMMITTED
↓
NON-REPEATABLE READ
디스크 (데이터 파일)
메모리 (버퍼)
| emp_no | first_name |
|---|---|
| 50000 | Lara |
메모리 (UNDO 로그)
| emp_no | first_name |
|---|---|
| 50000 | Toto |
| emp_no | first_name |
|---|---|
| 49999 | Francesca |
| 50000 | Lara |

사용자A
BEGIN

사용자B
BEGIN
UPDATE
SET first_name='Toto'
SELECT
WHERE first_name='Toto'
READ COMMITTED
↓
NON-REPEATABLE READ
디스크 (데이터 파일)
메모리 (버퍼)
| emp_no | first_name |
|---|---|
| 50000 | Lara |
메모리 (UNDO 로그)
| emp_no | first_name |
|---|---|
| 50000 | Toto |
| emp_no | first_name |
|---|---|
| 49999 | Francesca |
| 50000 | Lara |
SELECT
WHERE first_name='Toto'

사용자A
BEGIN

사용자B
BEGIN
UPDATE
SET first_name='Toto'
SELECT
WHERE first_name='Toto'
READ COMMITTED
↓
NON-REPEATABLE READ
디스크 (데이터 파일)
메모리 (버퍼)
메모리 (UNDO 로그)
| emp_no | first_name |
|---|---|
| 49999 | Francesca |
| 50000 | Toto |
COMMIT(Toto)
SELECT
WHERE first_name='Toto'

사용자A
BEGIN

사용자B
BEGIN
UPDATE
SET first_name='Toto'
SELECT
WHERE first_name='Toto'
SELECT
WHERE first_name='Toto'
COMMIT(Toto)
READ COMMITTED
↓
NON-REPEATABLE READ
디스크 (데이터 파일)
메모리 (버퍼)
메모리 (UNDO 로그)
| emp_no | first_name |
|---|---|
| 49999 | Francesca |
| 50000 | Toto |
Toto
SELECT
WHERE first_name='Toto'

사용자A
BEGIN

사용자B
BEGIN
UPDATE
SET first_name='Toto'
SELECT
WHERE emp_no=50000
SELECT
WHERE emp_np=50000
COMMIT(Toto)
READ COMMITTED
↓
NON-REPEATABLE READ
디스크 (데이터 파일)
메모리 (버퍼)
메모리 (UNDO 로그)
| emp_no | first_name |
|---|---|
| 49999 | Francesca |
| 50000 | Toto |
Lara
SELECT
WHERE emp_np=50000
Lara
Toto
REPEATABLE READ
트랜잭션마다 트랜잭션 ID를 부여하여
현 ID보다 작은 ID에서 변경한 것만 읽게 한다.
REPEATABLE READ

사용자A

사용자B
SELECT
WHERE emp_no=50000
| TRX_ID | emp_no | first_name |
|---|---|---|
| 6 | 49999 | Francesca |
| 6 | 50000 | Lara |
BEGIN(TRX_ID: 10)
디스크 (데이터 파일)
메모리 (버퍼)
메모리 (UNDO 로그)
Lara
REPEATABLE READ

사용자A

사용자B
SELECT
WHERE emp_no=50000
BEGIN(TRX_ID: 10)
UPDATE
SET first_name='Toto'
BEGIN(TRX_ID: 12)
| TRX_ID | emp_no | first_name |
|---|---|---|
| 6 | 50000 | Lara |
| TRX_ID | emp_no | first_name |
|---|---|---|
| 6 | 49999 | Francesca |
| 6 | 50000 | Lara |
디스크 (데이터 파일)
메모리 (버퍼)
메모리 (UNDO 로그)
| TRX_ID | emp_no | first_name |
|---|---|---|
| 12 | 50000 | Toto |
Lara
REPEATABLE READ

사용자A

사용자B
SELECT
WHERE emp_no=50000
BEGIN(TRX_ID: 10)
UPDATE
SET first_name='Toto'
BEGIN(TRX_ID: 12)
| TRX_ID | emp_no | first_name |
|---|---|---|
| 6 | 50000 | Lara |
COMMIT(TRX_ID: 12)
디스크 (데이터 파일)
메모리 (버퍼)
메모리 (UNDO 로그)
| TRX_ID | emp_no | first_name |
|---|---|---|
| 6 | 49999 | Francesca |
| 12 | 50000 | Toto |
Lara
REPEATABLE READ

사용자A

사용자B
SELECT
WHERE emp_no=50000
BEGIN(TRX_ID: 10)
UPDATE
SET first_name='Toto'
BEGIN(TRX_ID: 12)
COMMIT(TRX_ID: 12)
SELECT
WHERE emp_no=50000
| TRX_ID | emp_no | first_name |
|---|---|---|
| 6 | 50000 | Lara |
디스크 (데이터 파일)
메모리 (버퍼)
메모리 (UNDO 로그)
| TRX_ID | emp_no | first_name |
|---|---|---|
| 6 | 49999 | Francesca |
| 12 | 50000 | Toto |
Lara
Lara
REPEATABLE READ

사용자A

사용자B
SELECT
WHERE emp_no=50000
BEGIN(TRX_ID: 10)
UPDATE
SET first_name='Toto'
BEGIN(TRX_ID: 12)
COMMIT(TRX_ID: 12)
SELECT
WHERE emp_no=50000
| TRX_ID | emp_no | first_name |
|---|---|---|
| 6 | 50000 | Lara |
디스크 (데이터 파일)
메모리 (버퍼)
메모리 (UNDO 로그)
| TRX_ID | emp_no | first_name |
|---|---|---|
| 6 | 49999 | Francesca |
| 12 | 50000 | Toto |
Lara
Lara
SELECT
WHERE emp_no=50000
Lara

사용자A

사용자B
SELECT
WHERE emp_no>=50000
FOR UPDATE
BEGIN(TRX_ID: 10)
Lara
REPEATABLE READ
↓
PHANTOM READ
| TRX_ID | emp_no | first_name |
|---|---|---|
| 6 | 49999 | Francesca |
| 6 | 50000 | Lara |
디스크 (데이터 파일)
메모리 (버퍼)
메모리 (UNDO 로그)
REPEATABLE READ
↓
PHANTOM READ

사용자A

사용자B
BEGIN(TRX_ID: 10)
Lara
| TRX_ID | emp_no | first_name |
|---|---|---|
| 6 | 49999 | Francesca |
| 6 | 50000 | Lara |
| 12 | 50001 | Georgi |
INSERT(Georgi)
BEGIN(TRX_ID: 12)
COMMIT(TRX_ID: 12)
SELECT
WHERE emp_no>=50000
FOR UPDATE
디스크 (데이터 파일)
메모리 (버퍼)
메모리 (UNDO 로그)

사용자A

사용자B
BEGIN(TRX_ID: 10)
Lara
INSERT(Georgi)
BEGIN(TRX_ID: 12)
COMMIT(TRX_ID: 12)
REPEATABLE READ
↓
PHANTOM READ
SELECT
WHERE emp_no>=50000
FOR UPDATE
SELECT
WHERE emp_no>=50000
FOR UPDATE
Lara
Georgi
| TRX_ID | emp_no | first_name |
|---|---|---|
| 6 | 49999 | Francesca |
| 6 | 50000 | Lara |
| 12 | 50001 | Georgi |
디스크 (데이터 파일)
메모리 (버퍼)
메모리 (UNDO 로그)
week24
By Yongki Kim
week24
- 51