트랜잭션
트랜잭션을 왜 사용해야 할까?
데이터 베이스 Update문을 사용할 때 Update문은 굉장히 위험한 명령어이므로 꼭 트랜잭션 안에서만 사용해주셔야 합니다. 특히 Update문에 실수로 Where 절을 쓰지 않고 실행을 하게 되면 테이블에 있는 컬럼이 모두 바뀌게 되는데 이런 큰 실수를 하면 되돌릴 수도 없고 바로 사직서를 써야 하는 상황이 연출될 수도 있다고 합니다.. 그러므로 먼저 Update에 하기에 앞서서 Select문으로 자신이 바꿔야할 데이터를 조회한 뒤 꼭 트랜잭션 안에서 Update를 실행해주도록 하는 것이 좋습니다.
트랜잭션이란?
하나의 처리를 여러 단계로 나누는 기능을 트랜잭션(Transaction)이라 합니다. 하나의 처리를 Commit이라는 명령어를 수행하기 전 마지막으로 한 번 더 확인할 수 있는 기회를 줌으로써 좀 더 안정적인 데이터베이스 작업을 가능하게 합니다. 트랜잭션의 실행 결과를 데이터베이스에 반영하는 것을 Commit이라 하고 반영하기 전으로 되돌리는 것을 RollBack이라 고 합니다.
BEGIN TRAN -- 트랜잭션 시작
ROLLBACK TRAN -- 트랜잭션 이전 상태로 ROLLBACK
COMMIT TRAN -- 트랜잭션 완료
트랜잭션 + Update
SELECT * FROM 테이블명
WHERE 컬럼명 = '내용' -- 컬럼의 존재 확인
BEGIN TRAN --트랜잭션 시작
UPDATE [테이블명]
SET [Update할 컬럼] = '바꿀 문구'
WHERE [컬럼명] ='기존 문구' -- 홍길동을 이순신으로 바꿈
SELECT * FROM 테이블명
WHERE 컬럼명 = '바뀐 문구'-- 나만 바뀐것을 확인할수 있고 아직 적용은 안되어있는 상태이다.
ROLLBACK TRAN -- 되돌리기 -- Update 취소
COMMIT TRAN -- 트랜잭션 완료 -- Update 적용
예제
1. My_Table에서 회사코드(COMPANY)가 '0327'이고 날짜(DT)가 2017년인 데이터를 '20190101로 수정
SELECT * FROM My_Table
WHERE COMPANY='0327'
AND DT LIKE '2017%' --Update할 데이터 조회
BEGIN TRAN -- 트랜잭션 시작
UPDATE My_Table
SET DT= '20190101'
WHERE CD_COMPANY ='0327'
AND DT LIKE '2017%' --Update수행
SELECT * FROM My_Table
WHERE COMPANY ='0327'
AND DT LIKE '2019%' --바뀐 데이터 확인
COMMIT TRAN -- 트랜잭션 반영
2. My_Table에서 데이터에 회사코드(COMPANY) ='0327인 컬럼을 공급금액(AM)은 수량(QT)*단가(UM)로 재계산
SELECT * FROM My_Table
WHERE COMPANY = '0327'
BEGIN TRAN
UPDATE My_Table
SET AM = QT * UM
WHERE COMPANY = '0327'
SELECT * FROM My_Table
WHERE COMPANY = '0327'
COMMIT TRAN
3. My_Table에서 회사코드(COMPANY)='0327'인 컬럼을 날짜(DTS)는 '시스템일자' 이고 데이터에 부가세(VAT)는 공급금액(AM)의 10%로 재계산
SELECT * FROM My_Table
WHERE COMPANY ='0327'
BEGIN TRAN
UPDATE My_Table
SET VAT = AM * 0.1
, DTS=NEOE.SF_SYSDATE(GETDATE())
WHERE CD_COMPANY ='0327'
SELECT * FROM My_Table
WHERE COMPANY ='0327'
COMMIT TRAN
@@ TRANCOUNT
@@TRANCOUNT는 현재 연결에서 발생한 BEGIN TRANSACTION 문의 수를 반환합니다.
BEGIN TRANSACTION 문은 @@TRANCOUNT를 1씩 늘립니다.
ROOLBACK TRANSACTION 문은 @@TRANCOUNT를 0으로 줄입니다.
COMMIT TRANSACTION 문은 @@TRANCOUNT를 1씩 줄입니다.
1. BEGIN 및 COMMIT 문의 영향
PRINT @@TRANCOUNT
-- The BEGIN TRAN statement will increment the
-- transaction count by 1.
BEGIN TRAN
PRINT @@TRANCOUNT
BEGIN TRAN
PRINT @@TRANCOUNT
-- The COMMIT statement will decrement the transaction count by 1.
COMMIT
PRINT @@TRANCOUNT
COMMIT
PRINT @@TRANCOUNT
--Results
--0
--1
--2
--1
--0
2. BEGIN 및 ROLLBACK 문의 영향
PRINT @@TRANCOUNT
-- The BEGIN TRAN statement will increment the
-- transaction count by 1.
BEGIN TRAN
PRINT @@TRANCOUNT
BEGIN TRAN
PRINT @@TRANCOUNT
-- The ROLLBACK statement will clear the @@TRANCOUNT variable
-- to 0 because all active transactions will be rolled back.
ROLLBACK
PRINT @@TRANCOUNT
--Results
--0
--1
--2
--0
위의 두 예시에서 PRINT 대신 SELECT를 하여도 무관합니다.
SELCET @@TRANCOUNT
본 글은 아래 링크의 내용을 참고하여 학습한 내용을 나름대로 정리한 글임을 밝힙니다.
https://coding-factory.tistory.com/82
https://docs.microsoft.com/ko-kr/sql/t-sql/functions/trancount-transact-sql?view=sql-server-ver15
'DataBase' 카테고리의 다른 글
[MySQL/MSSQL] 프로그래머스 SQL문제 풀이#1 (0) | 2022.03.02 |
---|---|
[MSSQL] 인덱스(INDEX) #1 + 페이지(Page) (0) | 2022.02.28 |
[MSSQL] 프로시저 (PROCEDURE) (0) | 2022.02.24 |
[MSSQL] GO의 의미 (0) | 2022.02.24 |
[MySQL] CHAR, VARCHAR 차이점 + TEXT (2) | 2022.02.24 |