<참조사이트>
https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98Transaction-%EC%9D%B4%EB%9E%80-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC
https://www.youtube.com/watch?v=e9PC0sroCzc
https://www.youtube.com/watch?v=urpF7jwVNWs
https://www.youtube.com/watch?v=poyjLx-LOEU
-> 더이상 분할이 불가능한 업무 처리의 단위. 즉 한꺼번에 수행되어야 할 일련의 연산 모음이다.(작업 단위)
-> 여러 읽기와 쓰기를 논리적으로 하나로 묶은 것
우리는 트랜잭션을 통해 데이터 거래에 있어서 안전성을 확보 할 수 있다.
데이터 처리중, 오류가 발생하면 결과를 재반영 하는 것이 아닌 , 모든 작업을 원상태로 복구할 수있고 (roll back), 처리 과정이 모두 성공 하였을때에만 결과를 반영(commit)한다.
생각해보기 : 트랜잭션이 없다면 어떤 일이 벌어질까?
https://www.youtube.com/watch?v=e9PC0sroCzc
트랜잭션의 범위를 잡을때 , 우리가 문제가 발생했을때 롤백해야 하는 범위이다. 라고 생각하고 잡는다면 도움이 된다!! (아직 와닿지는 않지만 정말 중요한 말인거같다.)
여러 메서드 호출이 한 트랜잭션에 묶이도록 하기 위해 필요 (주로 프레임워크 에서 제공)
ex) @Transactional : 하위 에서 호출하는 메소드까지 모두 한 트렌잭션으로 묶이도록 제공.
https://www.youtube.com/watch?v=urpF7jwVNWs
-> ACID는 데이터베이스 내에서 일어나는 하나의 트랜잭션(transaction)의 안전성을 보장하기 위해 필요한 성질이다. (주식거래, 금융업에서 중점적으로 사용)
-> All or Nothing
-> 트랜잭션은 DB에 모두 반영되거나 , 전혀 반영되지 않아야 한다.
(완료 되지 않은 트랜잭션의 중간 상태를 DB에 반영해서는 안된다
-> 원자성이 깨진다면, 오작동 했을시 (오류시) 원인을 찾기가 매우 힘들어질 것이다.
-> 트랜잭션이 일어난 이후의 데이터베이스는 데이터베이스의 제약이나 규칙을 만족해야 한다.
예를 들어, 통장 잔고가 -가 된다던가, 이름이 없는 회원을 추가한다 같은 트랜잭션은 일관성을 위반한다.
-> 둘 이상의 트랜잭션이 동시 실행되고 있을때, 어떤 트랜잭션도 다른 트랜잭션 연산에 끼어들 수 없다.
-> 각각의 트랜잭션은 서로 간섭 없이 독립적으로 이루어져야 한다.
<예시>
예를 들어 계좌에 만 원이 있다고 가정한다.
이 계좌로부터 계좌 B로 6천 원을, 계좌 C로 6천 원을 동시에 계좌 이체하는 경우, 계좌 B에 먼저 송금한 뒤 계좌 C에 보내는 결과와 동일해야 한다.
동시에 트랜잭션을 실행한다고 해서 계좌 B와 C에 각각 6천 원씩 송금하여 마이너스 통장이 되는 것이 아니다.
각각의 송금 작업을 연속으로 실행하는 것과 동일한 결과가 나타나야 한다.
격리성을 지키는 각 트랜젝션은 철저히 독립적이기 때문에, 다른 트랜젝션의 작업 내용을 알 수 없다.
그리고 트랜잭션이 동시에 실행될 때와 연속으로 실행될 때의 데이터베이스 상태가 동일해야 한다.
https://www.youtube.com/watch?v=poyjLx-LOEU 바탕으로 정리.
DB : 여러 사용자가 하나의 객체(DB 저장소) 를 동시에 접근 하고 공유 가능하다.
격리 수준 : 동시에 DB 에 접근할 때, 그 접근은 어떻게 제어할지에 대한 설정
- 동시성 관련 다양한 문제들
Dirty read 발생.
Read Commited
MySQL의 기본 격리 수준은 "REPEATABLE READ"고, 레코드가 아닌 인덱스 레코드에 락을 건다.
ex) update article set readcnt = readcnt + 1 where id = 1;
주의 할점 : DB 가 원자적 연산을 지원하는지 확인 하기.
동시성은 초보자가 놓치기 쉬운 문제 [동시성문제와 격리수준을 이해하는데에 집중]
잠금시간은 최소화 [잠금 시간이 길어지면 성능(처리량) 저하]
사용하는 DB 에 따라 격리 레벨과 동작방식이 다를 수 있기 때문에 따로 정리 필요.
-> 트랜잭션이 성공적으로 완료 됐을 경우 , 결과는 영구적으로 반영 되어야 한다.
DDL 문 (CREATE , DROP, ALTER, TRUNCATE 등) 의 명령문은 transaction 의 rollback 대상이 아니기 때문에 주의 해야한다.
mysql 기본 디폴트 값으로 auto-commit 이 on 되어있다.
세미콜론을 한번 찍을 때마다 DB에서 자동으로 commit 해주는 시스템.