해당 내용은 쉬운코드님의 영상을 기반으로 제작되었습니다
🔌 트랜잭션이란?
- 단일한 논리적인 작업의 단위
- 여러개의 SQL문들을 단일 작업으로 묶어 나눠질 수 없게 만든 것
- transaction의 SQL문들은 일부만 성공될 수 없다.
🔌 Commit & Rollback
- Commit
- 현재까지 작업한 내용을 DB에 영구적으로 저장한다
- 그리고 transaction은 종료한다.
- rollback
- 지금까지 작업들은 모두 취소하고 transaction 이전 상태로 되돌린다
- 그리고 transaction은 종료한다.
AutoCommit
● 각각의 SQL문을 자동으로 transaction 처리 해주는 개념이다
● SQL문이 성공적으로 실행하면 자동으로 commit 한다
● 실행 중 문제가 발생하면 자동으로 rollback 된다
● MySQL에서는 default로 autoCommit이 enabled 되어 있다.
● 다른 DBMS에서도 대부분 같은 기능을 제공한다
잘 생각해보면 우리는 기본적으로 쿼리문을 작성하면 따로 commit 하지 않아도 그 쿼리가 자연스럽게 적용되는 것을 알 수 있다.
🔌 @Transactional
트랜잭션은 결국 하나의 과정이다.
- transaction 을 킨다
- 우리가 원하는 쿼리를 작성한다
- commit or rollback 을 통해 여러개의 쿼리를 하나의 쿼리 처럼 다룬다.
- transaction 종료 → autoCommit 은 다시 on 이 된다.
하지만 중요한건 우리는 쿼리문이 필요할때 이렇게 DB로 가서 작성하지 않고 코드로 작성하게 되는 것이다.
public void transfer(String fromId, String told, int amount) {
try {
Connection connection = ...; // 트랜잭션을 키고
connection.setAutoCommit(false); // 자동 커밋을 off 시켜주고
... // 비즈니스 로직을 작성해주고
connection.commit(); // 완료시 커밋해주고
} catch (Exception e) {
connection.rollback(); // 혹여 예외처리로 인한 실패시 rollback을 해준다
} finally {
connection.setAutoCommit(true); // 다시 자동 커밋을 on 해준다
}
}
이러한 일련의 과정을 거치게 되는데 현실적으로 이건 우리가 비즈니스 로직을 하나 작성하자고 이렇게 줄줄이 적는것은 너무 불편하다. 불편하면 개발자는 개발을 하게 된다 그래서 등장한 것이 바로 Transactional인 것이다.
Transactional의 등장으로 우리는 비즈니스 로직만 신경쓰게 될 수 있게 되었다.
@Transactional
public void transfer(String fromId, String told, int amount) {
// 그저 비즈니스 로직 작성
}
🔌 트랜잭션의 특징 ACID
특징을 설명하기 전에 하나의 예를 들어보자 별거 아닌것 같지만 하나의 일련의 과정으로 트랜잭션처럼 움직여야 한다.
J는 십만원을 가지고 있고, H는 15만원을 가지고 있다고 생각해보자
J는 H에게 만원을 이체하고 H는 이체를 받았다. 그러면 이제 J는 9만원을 가지고 있고 H는 16만원을 가지게 되었다.
- Atomicity (원자성)
- 이체와 받는것이 모두 성공되어야 한다. 만약 두 가지 중 하나라도 실패하면 모두 실패해야한다.
- 실패한다면 rollback 된다.
- Consistency (일관성)
- J가 H에게 10만원을 이체하려는데 잔액이 부족하다 그렇다면 당연히 이체는 되지 않아야 한다. 이때 제약사항으로 0원 이하는 될 수 없기 때문에 첫번째 쿼리부터 실패하면서 해당 transaction은 모두 rollback된다.
- 이렇게 데이터는 제약조건에 의해 모든 데이터가 일관성을 가지고 있을것이다.
- Isolation (고립성)
- 여러 개의 transaction은 서로의 상태를 알지 못한다
- J가 H에게 입금(tracsaction)을 하려는데 H가 그 도중 자신에게 입금(transaction)을 한것이다. 이렇게 두개의 transaction이 부딫히면서 아직 업데이트 되지 않은 H의 계좌를 읽어오고 데이터를 업데이트 해주기 때문에 중간에 업데이트 된 상태를 무시하게 되버린다.
- 그래서 Isolation은 각각의 transaction은 동시에 실행되면 혼자 실행되는 것처럼 만든다.
- 다양한 isolation level 을 제공하고 개발자는 어떤 level로 동작할지 설정할 수 있다.
- concurrency control(동시성 제어) 의 주된 목표는 isolation이다.
- Durability (지속성)
- 우리가 하나의 transaction이 끝나면 데이터가 수정되고 그 값은 영원히 비휘발성으로 저장된다.
- DB에 문제가 발생해도 데이터는 남는다. 이는 DBMS가 보장한다.
'CS > 💾 DB' 카테고리의 다른 글
💾 MVCC, 트랜잭션 ( 5 ) (feat. MySQL과 PostgreSQL 비교) (1) | 2024.04.27 |
---|---|
💾 LOCK을 활용한 트랜잭션( 4 ) (1) | 2024.04.26 |
💾 Isolation Level, 트랜잭션 ( 3 ) (1) | 2024.04.23 |
💾 Concurrency control의 기초, 트랜잭션 ( 2 ) (0) | 2024.04.23 |
💾 ORM이란? (0) | 2023.09.16 |
해당 내용은 쉬운코드님의 영상을 기반으로 제작되었습니다
🔌 트랜잭션이란?
- 단일한 논리적인 작업의 단위
- 여러개의 SQL문들을 단일 작업으로 묶어 나눠질 수 없게 만든 것
- transaction의 SQL문들은 일부만 성공될 수 없다.
🔌 Commit & Rollback
- Commit
- 현재까지 작업한 내용을 DB에 영구적으로 저장한다
- 그리고 transaction은 종료한다.
- rollback
- 지금까지 작업들은 모두 취소하고 transaction 이전 상태로 되돌린다
- 그리고 transaction은 종료한다.
AutoCommit
● 각각의 SQL문을 자동으로 transaction 처리 해주는 개념이다
● SQL문이 성공적으로 실행하면 자동으로 commit 한다
● 실행 중 문제가 발생하면 자동으로 rollback 된다
● MySQL에서는 default로 autoCommit이 enabled 되어 있다.
● 다른 DBMS에서도 대부분 같은 기능을 제공한다
잘 생각해보면 우리는 기본적으로 쿼리문을 작성하면 따로 commit 하지 않아도 그 쿼리가 자연스럽게 적용되는 것을 알 수 있다.
🔌 @Transactional
트랜잭션은 결국 하나의 과정이다.
- transaction 을 킨다
- 우리가 원하는 쿼리를 작성한다
- commit or rollback 을 통해 여러개의 쿼리를 하나의 쿼리 처럼 다룬다.
- transaction 종료 → autoCommit 은 다시 on 이 된다.
하지만 중요한건 우리는 쿼리문이 필요할때 이렇게 DB로 가서 작성하지 않고 코드로 작성하게 되는 것이다.
public void transfer(String fromId, String told, int amount) {
try {
Connection connection = ...; // 트랜잭션을 키고
connection.setAutoCommit(false); // 자동 커밋을 off 시켜주고
... // 비즈니스 로직을 작성해주고
connection.commit(); // 완료시 커밋해주고
} catch (Exception e) {
connection.rollback(); // 혹여 예외처리로 인한 실패시 rollback을 해준다
} finally {
connection.setAutoCommit(true); // 다시 자동 커밋을 on 해준다
}
}
이러한 일련의 과정을 거치게 되는데 현실적으로 이건 우리가 비즈니스 로직을 하나 작성하자고 이렇게 줄줄이 적는것은 너무 불편하다. 불편하면 개발자는 개발을 하게 된다 그래서 등장한 것이 바로 Transactional인 것이다.
Transactional의 등장으로 우리는 비즈니스 로직만 신경쓰게 될 수 있게 되었다.
@Transactional
public void transfer(String fromId, String told, int amount) {
// 그저 비즈니스 로직 작성
}
🔌 트랜잭션의 특징 ACID
특징을 설명하기 전에 하나의 예를 들어보자 별거 아닌것 같지만 하나의 일련의 과정으로 트랜잭션처럼 움직여야 한다.
J는 십만원을 가지고 있고, H는 15만원을 가지고 있다고 생각해보자
J는 H에게 만원을 이체하고 H는 이체를 받았다. 그러면 이제 J는 9만원을 가지고 있고 H는 16만원을 가지게 되었다.
- Atomicity (원자성)
- 이체와 받는것이 모두 성공되어야 한다. 만약 두 가지 중 하나라도 실패하면 모두 실패해야한다.
- 실패한다면 rollback 된다.
- Consistency (일관성)
- J가 H에게 10만원을 이체하려는데 잔액이 부족하다 그렇다면 당연히 이체는 되지 않아야 한다. 이때 제약사항으로 0원 이하는 될 수 없기 때문에 첫번째 쿼리부터 실패하면서 해당 transaction은 모두 rollback된다.
- 이렇게 데이터는 제약조건에 의해 모든 데이터가 일관성을 가지고 있을것이다.
- Isolation (고립성)
- 여러 개의 transaction은 서로의 상태를 알지 못한다
- J가 H에게 입금(tracsaction)을 하려는데 H가 그 도중 자신에게 입금(transaction)을 한것이다. 이렇게 두개의 transaction이 부딫히면서 아직 업데이트 되지 않은 H의 계좌를 읽어오고 데이터를 업데이트 해주기 때문에 중간에 업데이트 된 상태를 무시하게 되버린다.
- 그래서 Isolation은 각각의 transaction은 동시에 실행되면 혼자 실행되는 것처럼 만든다.
- 다양한 isolation level 을 제공하고 개발자는 어떤 level로 동작할지 설정할 수 있다.
- concurrency control(동시성 제어) 의 주된 목표는 isolation이다.
- Durability (지속성)
- 우리가 하나의 transaction이 끝나면 데이터가 수정되고 그 값은 영원히 비휘발성으로 저장된다.
- DB에 문제가 발생해도 데이터는 남는다. 이는 DBMS가 보장한다.
'CS > 💾 DB' 카테고리의 다른 글
💾 MVCC, 트랜잭션 ( 5 ) (feat. MySQL과 PostgreSQL 비교) (1) | 2024.04.27 |
---|---|
💾 LOCK을 활용한 트랜잭션( 4 ) (1) | 2024.04.26 |
💾 Isolation Level, 트랜잭션 ( 3 ) (1) | 2024.04.23 |
💾 Concurrency control의 기초, 트랜잭션 ( 2 ) (0) | 2024.04.23 |
💾 ORM이란? (0) | 2023.09.16 |