테이블 내용을 변경하는 SQL들이 연달아 실행되며 이것들이 마치 하나의 SQL처럼 다 같이 성공하던지 아니면 실패해야 한다면 트랜잭션 사용이 필수여야 한다 !
트랜잭션이란? (1)
Atomic하게 실행되어야 하는 SQL들을 묶어서 하나의 작업처럼 처리하는 방법
이는 DDL이나 DML중 레코드를 수정/추가/삭제한 것에만 의미가 있다.
SELECT에는 트랜잭션을 사용할 이유가 없음
BEGIN과 END 혹은 BEGIN과 COMMIT사이에 해당 SQL들을 사용
ROLLBACK
트랜잭션이란? (2)
은행 계좌 이체가 아주 좋은 예다.
계좌 이체 : 인출과 입금의 두 과정으로 이루어짐
만일 인출은 성공했는데 입금이 실패한다면?
이 두 과정은 동시에 성공하던지 실패해야함 > Atomic하다는 의미
이런 과정들을 트랜잭션으로 묶어줘야 한다.
조회만 한다면 트랜잭션으로 묶일 이유가 없다.
트랜잭션이란? (3)
BEGIN; -- START TRANSACNTION
A의 계좌로부터 인출;
B의 계좌로 입금;
END; --COMMIT
BEGIN과 START TRANSACTION은 같은 의미
END와 COMMIT은 동일
만일 BEGIN전의 상태로 돌아가야 한다면 ROLLBACK 실행
이 동작은 autocommit 모드에 따라 달라진다.
트랜잭션 커밋 모드 : autocommit (1)
autocommit : True
모든 레코드 수정/삭제/추가 작업이 기본적으로 바로 데이터베이스에 쓰여짐. 이를 커밋된다고 함
만일 특정 작업을 트랜잭션으로 묶고 싶다면 BEGIN과 END/ROLLBACK으로 처리
autocommit : False
모든 레코드 수정/삭제/추가 작업이 없이 commit이 호출될 때까지 커밋되지 않음
즉 명시적으로 커밋을 해야함
ROLLBACK이 호출되면 앞서 작업들이 무시된다.
트랜잭션 커밋모드 확인
show variables like ‘autocommit’;
set autocommit=0 (혹은1)
DELETE FROM vs TRUNCATE
delete from table _name
테이블에서 모든 레코드를 삭제
drop table table_name
where 사용해 특정 레코드만 삭제 가능
truncate table_name도 테이블에서 모든 레코드를 삭제
delete from은 속도가 느림
truncate이 전체 테이블의 내용 삭제시에는 여러모로 유리
하지만 두가지 단점이 존재한다.
truncate는 where을 지원하지 않는다.
truncate는 transcation을 지원하지 않는다.
트랜잭션 실습 (SQL과 자바)
했음.
View 소개와 실습
뷰란?
자주 사용하는 SQL 쿼리(SELECT)에 이름을 주고 그 사용을 쉽게 하는 것
이름이 있는 쿼리가 View로 데이터베이스단에 저장됨
select 결과가 테이블로 저장되는 것이 아니라 view가 사용될 때 마다 select가 실행됨
그런 이유로 가상 테이블이라고 부르기도 한다.
CREATE OR REPLACE VIEW 뷰이름 AS SELECT …
뷰란? (2)
예를들어 아래 select를 기본으로 자주 사용한다면
select s.id s.user_id, s.created, s.channel_id, c.channel
from session s
JOIN channel c ON c.id = s.channel_id;
CREATE OR REPLACE VIEW test.session_details AS
select s.id s.user_id, s.created, s.channel_id, c.channel
from session s
JOIN channel c ON c.id = s.channel_id;
select * from test.session_details;
Stored Procedure, Trigger 소개와 실습
Stored Procedure란?
MySQL 서버단에 저장되는 SQL 쿼리들
CREATE PROCEDURE 사용
DROP PROCEDURE [IF EXISTS]로 제거
프로그래밍 언어의 함수처럼 인자를 넘기는 것이 가능
리턴되는 값은 레코드들의 집합 (SELECT와 동일)
간단한 분기문(if, case)와 루프를 통한 프로그램이 가능
디버깅이 힘들고 서버단의 부하를 증가시킨 다는 단점이 존재
Stored Procedure란? (2)
정의문법 > DELIMITER > > CREATE PROCEDURE procedure_name(parameter_list) > > BEGIN > > select * from test.keeyoung_session_details > > END > > DELIMITER;