Transaction
[ Transaction 사용 순서 ]
BEGIN TRANSACTION
-- 실행
UPDATE TABLE01
...
-- 실행
COMMIT TRANSACTION
-- 실행 (수정사항을 최종 적용)
ROLLBACK TRANSACTION
-- 실행 (수정취소. 수정하기 이전 상태로 돌아감)
- UPDATE문 실행 후, 원하는 결과가 나온 것을 확인했다면 COMMIT, 원하는 결과가 나오지 않아서 BEGIN TRAN 이전 상태로 되돌리고싶다면 ROLLBACK 명령을 실행
- TRANSACTION 을 줄여서 'TRAN'이라고 작성해도 무방하다.
BEGIN TRAN;
UPDATE ..
COMMIT TRAN;
[ Transaction을 사용하는 이유 ]
1. 테이블은 한 번에 1명만 접근하여 수정할 수 있다. 즉, 내가 BEGIN TRANSACTION을 걸고 해당 서버에서 dataset을 수정하고 있을 때 다른 사람도 테이블을 조회하고 수정하려 하면 일관성이 깨지는 문제가 발생한다.
2. 여러 테이블을 한꺼번에 수정하는 경우, DB의 일관성이 깨질 수 있다. 예를 들어 table01과 table02가 있다고 하자. 이 두 개를 동시에 수정하다가 어떠한 이유로 table01은 수정되고 table02는 수정에 실패할 수 있다. 이렇게되면 두 테이블은 서로 다른 값을 가지게 되는 문제가 발생한다.
[ 참고 사항 및 꿀팁 ]
- BEGIN TRAN으로 table에 lock을 걸면 나를 제외한 모두가 해당 table을 조회할 수 없다. 이 때 다른 세션에서 lock이 풀리길 기다리는 현상을 "행(hang)"이라고 한다.
- 만약 모든 수정사항이 잘 끝난 것을 확인했다면 COMMIT TRAN 으로 테이블에 수정사항을 적용시키고, VISUAL STUDIO에서 execute하여 마무리한다. (commit 한 다음에는 begin tran 이전 상태로 되돌릴 수 없으므로 매우 신중하게 생각하기!)
- ROLLBACK을 catch문 안에 넣어서 테이블 수정 중 문제가 발생하면 바로 예외처리 및 begin tran 이전 상태로 되돌리는게 좋음
- Isolation Level을 select문에 넣어서 격리 수준을 조절해줄 수 있다.
- 내가 수정 중일 때 table에 lock이 걸려있지만 타인이 table 조회는 할 수 있게 격리수준을 조절해줄 수 있다. 그 사람은 내가 수정하기 전의 table만 조회할 수 있고, 그 때 우리는 "garbage table"이라고 부른다.
[ Transaction 특징 (ACID) ]
Atomicity (원자성) : transaction을 구성하는 모든 명령을 실행하거나 어떠한 명령도 실행하지 않음.
<=> All or nothing, commit or rollback
Consistency (일관성) : transaction 전후로 data가 손상되면 안됨. 즉, 여러 table에서 동일한 data가 서로 다른 값을 가지면 안됨.
Isolation (독립성, 고립성) : 여러 transaction이 수행될 때 성능, data 안정성 간의 trade-off라고 볼 수 있다.
- 모든 transaction은 동시에 일어나는 다른 transaction과 상관없이 DB에 대해 일관된 view를 가짐.
- 즉, 내가 먼저 tran 수행 -> 다른 tran 에서는 data table을 볼 수 없거나 "Transaction 진행중" 이라는 메세지가 뜸.
Durability (지속성) : transaction이 종료된 이후에도 data에 문제가 없어야함. DB는 정확한 data를 저장하고 정전 등의 상황으로부터 data를 보호해야됨. 보통은 transaction 기록을 주 데이터베이스 외에 다른 위치의 DB에 저장함.
'SQL > MSSQL' 카테고리의 다른 글
History 조회 - sequence number (0) | 2021.07.29 |
---|---|
Data Table 백업 (0) | 2021.07.29 |
DML언어_select/update/insert/delete (0) | 2021.07.29 |