728x90
정의
- 하나의 작업을 수행하기 위해 필요한 데이터베이스 연산들을 모아 놓은 것
- 작업 수행에 필요한 SQL 문들의 모임
- 논리적인 작업의 단위
- 장애 발생 시 복구 작업이나 병행 제어 작업을 위한 중요한 단위로 사용됨
- 데이터베이스의 무결성과 일관성을 보장하기 위해 작업 수행에 필요한 연산들을 하나의 트랜잭션으로 제대로 정의하고 관리해야 함
특성
Atomicity (원자성)
- 트랜잭션의 연산들이 모두 정상적으로 실행되거나 하나도 실행되지 않아야 하는 all-or-nothing
Consistency (일관성)
- 트랜잭션이 성공적으로 수행된 후에도 데이터베이스가 일관성 있는 상태를 유지해야 한다.
Isolation (격리성, 고립성)
- 수행 중인 트랜잭션이 완료될 때까지 다른 트랜잭션들이 중간 연산 결과에 접근할 수 없다.
- 여러 트랜잭션이 동시에 수행되더라도 마치 순서대로 하나씩 수행되는 것처럼 정확하고 일관된 결과를 얻을 수 있도록 제어하는 기능 필요
Durability (지속성, 영속성)
- 트랜잭션이 성공적으로 완료된 후 데이터베이스에 반영한 수행 결과는 영구적이어야 한다.
- 지속성의 보장을 위해서는 장애 발생 시 회복 기능이 필요
상태
I(nsert) -> D(elete) -> U(pdate) I 부분완료 > D 실패 => I 이전 시점으로 Rollback I 부분완료 > D 부분완료 > U 부분완료 > 완료 Commit |
활동 |
- 트랜잭션이 수행을 시작하여 현재 수행 중인 상태 |
부분완료 |
- 트랜잭션의 마지막 연산이 실행을 끝낸 직후의 상태 |
완료 |
- 트랜잭션이 성공적으로 완료되어 commi연산을 실행한 상태 - 트랜잭션이 수행한 최종 결과를 데이터베이스에 반영하고 데이터베이스가 새로운 일관된 상태가 되면서 트랜잭션이 종료됨. |
실패 |
- 장애가 발생하여 트랜잭션의 수행이 중단된 상태 |
철회 |
- 트랜잭션의 수행 실패로 rollback 연산을 실행한 상태 - 지금까지 실행한 트랜잭션의 연산을 모두 취소하고 트랜잭션이 수행되기 전의 데이터베이스 상태로 되돌리면서 트랜잭션이 종료됨. - 철회 상태로 종료된 트랜잭션은 상황에 따라 다시 수행되거나 폐기됨. |
MySQL 실습
- mysql은 자동커밋이 기본값이기 때문에 autocommit = false로 바꿔줘야한다.
- @@은 시스템변수
- 하나의 기능을 하나의 묶음으로 보기 ex) 회원가입, 로그인 등
- 단계 : Select id 중복체크 > 중복 아니라면 insert / 중복이라면 rollback > Insert완료시 commit
SELECT @@autocommit; 변수조회
SET @@autocommit:=0; 변수초기화
SELECT @@autocommit; 변수조회
START TRANSACTION; /* 트랜잭션 처리 시작 */
SELECT * FROM tb_member_trigger;
DELETE FROM tb_member_trigger;
SELECT * FROM tb_member_trigger;
ROLLBACK; /* delete 전 시점으로 rollback */
UPDATE tb_member_trigger
SET
m_name='홍길동'
WHERE
m_id='id014';
COMMIT; /* 변경사항 저장 */
SELECT * FROM tb_member_trigger; /* 변경 된 테이블 조회*/
SELECT * FROM tb_member;
SAVEPOINT a; /*변경 전 테이블 savepoint 지정*/
UPDATE tb_member SET m_name='홍002' WHERE m_id='id002';
SAVEPOINT b; /* 변경 후 테이블 savepoint 지정*/
DELETE FROM tb_member;
ROLLBACK TO SAVEPOINT b; /* delete 전 시점으로 rollback */
'{ "Hello World!" }; > DataBase' 카테고리의 다른 글
(DB) 트리거(Trigger) (0) | 2022.02.14 |
---|---|
(DB) 프로시저, 함수 (0) | 2022.02.14 |
(DB) eXERD 사용 방법 (0) | 2022.01.26 |
(DB) 뷰(VIEW) (0) | 2022.01.26 |
(DB) 서브 쿼리(Sub Query) (0) | 2022.01.23 |