mySQL에서의 트랜잭션
작성자 : 김영철
등록날짜 : 2009.01.29 15:46
오늘은 mySQL에서 트랜잭션에 대해 알아보겠습니다.
트랜잭션의 의미는 '일, 업무의 단위'라는 뜻도 있지만,
여기서는 '내가 작업하는 공간'이라고 이해하시면 될 듯 싶습니다.
그럼 먼저 왜 트랜잭션이 필요한 지 알아보겠습니다.
여기 A라는 사용자와 B라는 사용자가 있다고 칩시다.
A라는 사용자가
mysql> SELECT mycol FROM mytb;
를 했을때
3
이라는 결과가 출력되었다고 치죠.
이 때 A라는 사용자는 3을 7로 바꾸고 싶어서
mysql> UPDATE mytb SET mycol=7;
이라는 명령을 내렸습니다.
그럼 A라는 사용자가 예상하고 있는 결과는 7일겁니다.
그래서 A라는 사용자는 7로 제대로 바뀌었는지 확인하려고 하는데....,
갑자기 '따르릉~~'
잠시 전화를 받게 되었습니다. 아마도 애인에게서 걸려온 전화인듯 하네요.
그런데 바로 그 순간!!!
돌연 다른 곳에서 접속한 B라는 사용자가 그만,
mysql> UPDATE mytb SET mycol=4;
라는 명령을 내리고 말았습니다.
애인과의 전화를 끊고 흐뭇한 마음으로 결과를 확인하던 A
mysql> SELECT mycol FROM mytb;
결과는...?
4 !
쿠궁.......!
A는 '내가 치맨가?'하고 생각하겠지요.
다시한번 확인해도 역시 결과는 마찬가지....
결국 A는 '이런..맘대로 변하는 DB를 어떻게 믿고 작업을 해!!!' 라며 새로운길을 찾아 떠났다고 합니다.
이 이야기에서 우리는 한가지 교훈을 얻을 수 있습니다.
'애인의 전화는 받지말자'
가 아니라
'내가 작업하는 동안 딴 사람이 작업을 못하게 할 필요가 있다'
입니다.
그래서 등장한것이 바로 트랜잭션 L.O.C.K T.A.B.L.E.S 입니다.
이 LOCK 이라는 것을 걸어놓으면 걸어놓는 동안은 다른 사용자가 작업을 못합니다.
LOCK에는 READ락과 WRITE락이 있습니다.
먼저 READ락을 볼까요?
mysql> LOCK TABLES mytb READ;
이렇게 명령을 내리면 mytb라는 테이블에대해 read락이 걸린겁니다.
이렇게되면 다른 창이나 외부에서 mytb에 대해 SELECT만이 가능하게됩니다.
B라는 다른 사용자가
mysql> SELECT mycol FROM mytb;
하면 결과가 나오지만
mysql> UPDATE mytb SET mycol=4;
해도 아무일도 안일어납니다. 이 때는 마지 시스템이 다운된것처럼 딱!! 멈춰버립니다.
A라는 사용자가
mysql> UNLOCK TABLES;
라고 명령을 내리면 멈춰있던 B라는 사용자에게 그제서야 '성공적으로 수정되었다'는 메세지가 나옵니다.
다시말해 LOCK을 걸고있는 동안에는 다른 사용자가 테이블에 변경을 할 수 없다는 것이지요.
자, 그런데 A라는 사용자가 이번에는 LOCK을 걸어놓고 작업하는 동안에는
결과를 SELECT로도 볼 수 없게 하고 싶습니다.
네 맞습니다. 그럴때 쓰는 것이 write락입니다.
mysql> LOCK TABLES mytb WRITE;
이렇게하면 B라는 사용자는 select도 못하고 변경도 못합니다.
A가
mysql> UNLOCK TABLES;
이렇게 할때까지 말이지요.
이제 트랜잭션이 이해가 되셨죠?
트랜잭션의 의미는 '일, 업무의 단위'라는 뜻도 있지만,
여기서는 '내가 작업하는 공간'이라고 이해하시면 될 듯 싶습니다.
그럼 먼저 왜 트랜잭션이 필요한 지 알아보겠습니다.
여기 A라는 사용자와 B라는 사용자가 있다고 칩시다.
A라는 사용자가
mysql> SELECT mycol FROM mytb;
를 했을때
3
이라는 결과가 출력되었다고 치죠.
이 때 A라는 사용자는 3을 7로 바꾸고 싶어서
mysql> UPDATE mytb SET mycol=7;
이라는 명령을 내렸습니다.
그럼 A라는 사용자가 예상하고 있는 결과는 7일겁니다.
그래서 A라는 사용자는 7로 제대로 바뀌었는지 확인하려고 하는데....,
갑자기 '따르릉~~'
잠시 전화를 받게 되었습니다. 아마도 애인에게서 걸려온 전화인듯 하네요.
그런데 바로 그 순간!!!
돌연 다른 곳에서 접속한 B라는 사용자가 그만,
mysql> UPDATE mytb SET mycol=4;
라는 명령을 내리고 말았습니다.
애인과의 전화를 끊고 흐뭇한 마음으로 결과를 확인하던 A
mysql> SELECT mycol FROM mytb;
결과는...?
4 !
쿠궁.......!
A는 '내가 치맨가?'하고 생각하겠지요.
다시한번 확인해도 역시 결과는 마찬가지....
결국 A는 '이런..맘대로 변하는 DB를 어떻게 믿고 작업을 해!!!' 라며 새로운길을 찾아 떠났다고 합니다.
이 이야기에서 우리는 한가지 교훈을 얻을 수 있습니다.
'애인의 전화는 받지말자'
가 아니라
'내가 작업하는 동안 딴 사람이 작업을 못하게 할 필요가 있다'
입니다.
그래서 등장한것이 바로 트랜잭션 L.O.C.K T.A.B.L.E.S 입니다.
이 LOCK 이라는 것을 걸어놓으면 걸어놓는 동안은 다른 사용자가 작업을 못합니다.
LOCK에는 READ락과 WRITE락이 있습니다.
먼저 READ락을 볼까요?
mysql> LOCK TABLES mytb READ;
이렇게 명령을 내리면 mytb라는 테이블에대해 read락이 걸린겁니다.
이렇게되면 다른 창이나 외부에서 mytb에 대해 SELECT만이 가능하게됩니다.
B라는 다른 사용자가
mysql> SELECT mycol FROM mytb;
하면 결과가 나오지만
mysql> UPDATE mytb SET mycol=4;
해도 아무일도 안일어납니다. 이 때는 마지 시스템이 다운된것처럼 딱!! 멈춰버립니다.
A라는 사용자가
mysql> UNLOCK TABLES;
라고 명령을 내리면 멈춰있던 B라는 사용자에게 그제서야 '성공적으로 수정되었다'는 메세지가 나옵니다.
다시말해 LOCK을 걸고있는 동안에는 다른 사용자가 테이블에 변경을 할 수 없다는 것이지요.
자, 그런데 A라는 사용자가 이번에는 LOCK을 걸어놓고 작업하는 동안에는
결과를 SELECT로도 볼 수 없게 하고 싶습니다.
네 맞습니다. 그럴때 쓰는 것이 write락입니다.
mysql> LOCK TABLES mytb WRITE;
이렇게하면 B라는 사용자는 select도 못하고 변경도 못합니다.
A가
mysql> UNLOCK TABLES;
이렇게 할때까지 말이지요.
이제 트랜잭션이 이해가 되셨죠?
[출처] 민주가인
"쇼핑몰·홈페이지·오픈마켓
블로그·페이스북·이메일 등의 각종 마케팅 글쓰기, 각종 광고, 영업, 판매, 제안서, 전단지 반응율 3배×10배 이상 높이는 마법의 8단계 공식" |
☞자세히보기 |
|
|