TRANSACTION

CJB_ny·2022년 3월 27일
0

DataBase

목록 보기
19/29
post-thumbnail

규모가 큰 회사에서는 사용을 하는데

규모가 좀 작은 곳에서는 사용하지 않고 깡으로 나가기도한다.


문법은 간단한데

BEGIN TRAN || BEGIN TRANSACTION 둘중하나인데 앞에거 더 많이쓴다.

한다음에

COMMIT, ROLLBACK 을 하거나 선택 할 수 있다.

그래서 TRAN이 뭐냐하면은

여기서 두개의 테이블을 동시에 갱신을 하고싶을 경우가 있다.

players, salaries 에 다가 INSERT INTO 로 데이터 넣었는데

players는 실패하고 salaries만 성공하는 경우가 된다면

이상한 상황이 발생할 것이다.

만약 아이템 거래를 한다고 했을때

-- 거래
-- A의 인벤토리에서 아이템 제거
-- B의 인벤토리에다가 아이템 추가
-- A의 골드 감소

이부분에서 TRAN을 사용안하고 UPDATE를 할 수 있겠지만 3가지중 하나부분에서

에러가 난다면??

그리고 게임서버 부분에서 "원자성" 부분이랑 비슷한것도 있다.

한번에 다 일어나던가 아니면 다 일어 나지 않던가

"ALL OR NOTHING"

그래서 이런사태를 해결하기 위한것이 TRANSACTION이다.

이런식으로 데이터를 넣을 때

TRAN을 명시하지 않으면 자동으로 COMMIT이 된다고 보면된다.

TRAN을 명시하면 COMMIT || ROLLBACK 사용가능


그래서 실습을 해보면

이런식으로 ROLLBACK, COMMIT가능하다


그리고 성공/실패 여부에 따라

COMMIT을 하든지 에러가 나면 빠져나오는 것을 해보도록 하자.

C# 의 try catch와 같은 것이 있고

if, else도 다있다

그래서 BEGIN TRY에서 만약 에러가 뜬다면 BEGIN CATCH로 들어와서

@@TRANCOUNT > 0이라면은

ROLLBACK을 할 것이고 아무 문제 없으면 그냥 TRY부분만 실행하고 끝낸다.

이부분을 실행을 해보면

ROLLBACK했다고 뜬다.


< 주의 할 점 >

TRAN 을 사용할 때는 안에는 꼭! "원자적"으로 실행 될 애들만 넣자.

C#으로 예를 들면

List< player >, List< salary > 원자적으로 수정 ->

lock을 잡고 실행 -> writeLock(상호배타적 락)

readLock(공유 락)

이게 TRAN도 비슷한 개념이다.

그래서 한쪽에는 오래걸리는건지 어떤 이유에서 커밋이나 롤백하지 않고 이상태로 놔두고

컨트롤 + n으로 새창을 띄워서 이쪽에서는

이렇게 확인한다고 하고


이부분을 실행하고 SELECT * FROM accounts를 하면

(나는 지금 쿼리가 완료됬다고 뜨는데....뭐지?)

커밋 하는 순간

완료되어서 이렇게 뜬다.

계속 쿼리가 실행중인 이유는

한쪽에서

이쪽에서 락을 잡고있기 때문이다.

그래서 TRAN안에는 정말 필요한 부분만 넣어 놔야한다는 것이다.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글