=> 테이블 내용을 변경하는 SQL들이 연달아 실행되며 이것들이 마치 하나의 SQL처럼 다 같이 성공하던지 아니면 실패해야 한다면 이전 상태로 돌아가는 트랜잭션의 사용이 필수!
레코드를 수정/추가/삭제한 것에만 의미가 있음 → SELECT는 읽기만 하므로 트랜잭션을 사용할 이유가 없음
BEGIN과 END(or COMMIT) 사이에 해당 SQL들을 사용
ROLLBACK : BEGIN 뒤에 실행된 문장들이 무효화
→ END나 COMMIT이 불리기 전까지는 MySQL사용자에게는 바뀐것 처럼 보이지만 다른 사람들 눈에는 안보임
모든 레코드 수정/삭제/추가 작업을 명시적으로 커밋을 해야함
ROLLBACK : 앞의 과정 무효화
BEGIN과 END(COMMIT)/ROLLBACK이 없음 → 트랜잭션이라는 개념이 X
⇒ autocommit 여부는 SQL 클라이언트/라이브러리에 따라 달라짐
⇒ MySQL Workbench 기본은 autocommit이 True
확인 방법: SHOW VARIABLES LIKE 'AUTOCOMMIT'; →출력이 on이면 true
SET autocommit=0 (혹은 1)의 실행으로 변경가능
[정의 문법]
DELIMITER //
CREATE PROCEDURE procedure_name(parameter_list)
BEGIN
statements;
END //
DELIMITER ;
[정의 예]
DELIMITER //
CREATE PROCEDURE return_session_details()
BEGIN
SELECT *
FROM test.keeyong_session_details;
END //
DELIMITER;
[호출 문법]
CALL stored_procedure_name(argument_list);
[호출 예]
CALL return_session_details();
[정의 예]
DELIMITER $$
CREATE FUNCTION test.Channel_Type(channel varchar(32))
RETURNS VARCHAR(20)
DETERMINISTIC
BEGIN
DECLARE channel_type VARCHAR(20); --> Stored Procedure나 Stored Function 내에서 변수 선언은 DECLARE
IF channel in ('Facebook', 'Instagram', 'Tiktok') THEN
SET channel_type = 'Social Network';
ELSEIF channel in ('Google', 'Naver') THEN
SET channel_type = 'Search Engine';
ELSE
SET channel_type = channel;
END IF;
-- return the customer level
RETURN (channel_type);
END$$
[호출 예]
SELECT channel, test.Channel_Type(channel)
FROM prod.channel;
CREATE TRIGGER 트리거이름
{BEFORE | AFTER} {INSERT | UPDATE| DELETE }
ON table_name FOR EACH ROW
trigger_body;