1.트랜잭션 격리 수준이란 트랜잭션에서 일관성 없는 데이터를 허용하는 기준치라고 볼 수 있다.
수많은 트랜잭션이 차례로 처리된다면 성능이 많이 떨어지기 때문에
중요도 및 필요성에 따라 허용치를 다르게 해 최대효율을 구하는 방식이다.
최저효율이지만 트랜잭션 순차 처리방식으로 하면 문제 발생 여지가 없고(무결성)
모든 트랜잭션을 동시에 처리할 경우 동시성이 증가하지만 문제 발생 가능성이 높다.
2.트랜잭션 격리 수준에는 아래와 같은 4가지 단계가 있다.
커밋되지 않은 읽기 - 트랜잭션간 격리되지 않으며 기본 지원 격리 또한 무시된다.
커밋된 읽기 - 커밋 처리 되지 않은 경우 접근할 수 없어 대기하며 커밋된 데이터에만 접근 가능
반복 읽기 - 트랜잭션과 관련된 모등 행이 잠금 처리되어 동일한 결과가 나오게 한다. MySQL 기본 설정값이기도 하다.
직렬화 가능 - 트랜잭션과 관련된 모든 테이블을 잠금 처리하며 커밋, 롤백등 종료된 경우 잠금 해제된다.
낮은 단계의 격리 단계를 사용할 경우 아래와 같은 현상들이 나타날 수 있다.
Dirty Read - 수정중인 데이터를 읽을 수 있을 경우 변경중인 데이터를 읽는 현상
Non-Repeatable Read - 같은 트랜잭선을 수행해도 결과가 달라지는 현상
Phantom Read - 트랜잭션 도중 없던 데이터가 추가되는 현상
이는 격리 수준에 따라 아래와 같이 볼 수 있다.
트랜잭션 격리 수준 | Dirty Read | Non-Repeatable Read | Phantom Read |
커밋되지 않은 읽기 | V | V | V |
커밋된 읽기 | -- | V | V |
반복 읽기(MySql default) | -- | -- | V |
직렬화 가능 | -- | -- | -- |
(1).백준 5354번 J박스는 '#'로 둘러쌓인 내부 'J'를 채운 문자열을 출력하는 문제였다.
의아하게도 조건이 제대로 명시되어 있지 않아서 처음엔 오답이 나왔는데
주어진 값이 1 또는 2일 경우 '#', '##\n##'형태로 출력되어야 했다.
그 외에 딱히 어려운 점은 없었고 백틱 내부에서 repeat()을 사용해 'J'를 추가했다.
let input = `3
1
2
3
5
4`.split('\n').map(Number)
let result = []
for(let i = 1 ; i < input.length ; i++){
let arrs = ['#'.repeat(input[i])]
for(let j = 1 ; j < input[i]-1 ; j++){
arrs.push(`#${'J'.repeat(input[i]-2)}#`)
}
if(input[i] !== 1){
arrs.push('#'.repeat(input[i]))
}
result.push(arrs.join('\n'))
}
console.log(result.join('\n\n'))
'회고' 카테고리의 다른 글
[취업준비일지] - 58 (0) | 2022.12.17 |
---|---|
[취업준비일지] - 57 (0) | 2022.12.16 |
[취업준비일지] - 55 - 스터디 프로젝트 15일차 (0) | 2022.12.14 |
[취업준비일지] - 54 (0) | 2022.12.13 |
[취업준비일지] - 53 - 스터디 프로젝트 14일차 (0) | 2022.12.12 |