이제 트랜잭션에 대해 알아보도록 하겠습니다.
2. 트랜잭션(Transaction)
정의
트랜잭션이란 하나 이상의 SQL문으로 이루어진 작업의 단위입니다. 따라서 트랜잭션의 모든 과정은 전부 완료되거나,
혹은 취소되거나 둘 중 하나여야합니다.
계좌이체를 하는 과정을 생각해봅시다. 계좌이체를 하려면 어떻게 해야할까요?
우선 ATM기에 카드를 넣겠죠. 순차적으로 비밀번호와 인출할 금액을 입력하면 ATM기는 돈을 지급 할 것입니다.
하지만 이러한 과정에 있어서 기계가 고장나게되면 어떻게 될까요? 전산상으로는 돈이 인출이 되었는데,
실제로는 인출이 안되었다거나 혹은 인출은 되었는데 전산상으로는 돈이 인출되지 않았다거나..
이런 일이 정말 발생하게 된다면 상당히 심각한 문제가 발생되겠죠.
따라서 이러한 일이 미연에 방지되도록 저희는 코딩을 해야합니다. 그 방법이 트랜잭션입니다.
전산상으로도 처리가 잘되고 돈도 인출이 잘되고 이 과정을 한 묶음으로 처리하여 작업의 완전성을 보장해주는 것이죠.
특성 |
트랜잭션은 다음 4가지 특성으로 정의되며, ACID 특성이라고 합니다.
Atomicity : 원자성. all or nothing, 모든 작업은 모두 완료 되거나 취소되어야 한다.
Consistency : 일관성. 트랜잭션이 성공적으로 처리되면 데이터는 일관성있게 데이터베이스에 반영되어야 한다.
Isolation : 독립성, 분리성. 여러 트랜잭션이 실행되더라도 각각의 트랜잭션은 서로 간섭해서는 안된다.
Durability : 지속성, 영속성. 수행된 트랜잭션은 어떤 장애가 발생되더라도 보존되어야 한다.
격리 수준
트랜잭션을 원하는 의도대로 사용하려면 격리 수준(Isolation Level)에 대해 명확하게 알고 넘어가야 합니다.
격리 수준이란 트랜잭션에서 일관성이 없는 데이터를 허용 하는 정도 입니다. 무조건적으로 트랜잭션 간의 관여를 막는것은
데이터베이스의 성능을 저하시킬뿐만 아니라 사용자의 의도대로 사용 할 수 없어지기 때문입니다. 따라서 격리 수준을 조금 완화해
서로 영향을 받으면서 상충되지 않게 적절한 레벨을 지정하여 처리 하도록 해주어야 합니다.
// 격리 수준 확인
SHOW VARIABLES LIKE '%isolation%';
(1) Read Uncommitted (level 0)
(2) Read committed (level 1)
(3) Repeatable Read (level 2)
(4) Serializable (level 3)
Commit 과 Rollback |
InnoDB 엔진에서의 트랜잭션 |
// 격리 수준 변경 SET tx_isolation = "변경할 isolation 레벨";
COMMIT;
// autocommit 확인
SELECT @@ autocommit;
// autocommit 변경
SET autocommit = 0;
MyISAM 과 같은 트랜잭션을 지원하지 않는 엔진의 경우 Rolback , Commit 값이 무의미 합니다. 따라서 autocommit의 값과 상관없이 autocommit이 일어난다고 생각 하시면 됩니다.
'DBMS > MySQL & MariaDB' 카테고리의 다른 글
MySql ONLY_FULL_GROUP_BY ERROR(1055) (0) | 2025.04.08 |
---|---|
MySQL 백업 및 복원 (0) | 2020.02.18 |
MySQL 기본 명령어 (0) | 2019.03.05 |
MySQL 저장 엔진과 트랜잭션 처리 (1) (0) | 2017.11.02 |