일기

2023-01-30

SHsus 2023. 1. 31. 02:58

자동제출 관련해서 발생했던 문제가 동시성의 문제라고 생각하고 여러가지 방법을 시도하게 되었던 것을 내가 시도한것은 아니고 조원분께서 시도했었던 것에 관련해서 작성하는 글입니다..

따라서, 자세하게 적기엔 좀 무리가 있지만... 일단 조금이나마 정리해서 적어보도록 하겠읍디다..

 

시작하기에 앞서 동시성이란 무엇인가...

 

 

 

 

 

동시성(Concurrency)

단순히 사전적 의미로는 어떤 두 사건이 비슷하거나 혹은 같은 의미를 가지고 동시에 일어나는 것
자바에서 보면 한 CPU 에서 동시에 여러 작업을 하는 것처럼 보이게 만드는 것이다.
예로, 하나의 CPU 에서 2개의 프로세스가 있다고 가정하면, 이 둘은 매우 짧은 시간에 컨텍스트 스위치가 일어나 번갈아 실행된다. 그래서 사람이 볼 때 동시에 동작하는 것처럼 보이는 이것이 프로그래밍에서의 동시성을 의미한다.
싱글 코어에서 멀티 쓰레드를 동작 시키는 방식

 

병렬성(Parallelism)

실제로 동시에 여러 작업이 처리되는 것을 말한다.
2개 이상의 task 가 있을 때, 각 task 가 물리적인 시간으로 동시에 실행이 가능하다는 의미를 가진다. 즉, 여러 코어에서 여러 작업을 동시에 수행하는 것
멀티 코어에서 멀티 쓰레드를 동작시키는 방식

 

 

https://seamless.tistory.com/42

 

synchronized

하나의 객체에 여러 개의 대의 객체가 동시에 접근해 처리하는것을 막기 위해서 사용한다.
보통 메서드의 선언부에 쓰이고 이 키워드가 붙은 메서드는 한 번에 하나의 스레드만 접근이 가능하 메서드가 사용 중일 때 다른 스레드가 메서드를 호출하면 앞의 스레드가 종료될 때 까지 기다려야 한다.

synchronized 로 지정된 임계영역은 한 스레드가 이 영역에 접근하여 사용할 때 lock 이 걸림으로서 다른 스레드가 접근할 수 없게 된다.

이후 해당 스레드가 이 임계영역의 코드를 다 실행 후 벗어나게 되면 unlock 상태가 되어 그때서야 대기하고 있던 다른 스레드가 이 임계영역에 접근하여 다시 lock 을 걸고 사용할 수 있게 된다.

lock 는 해당 객체당 하나씩 존재하며, synchronized 로 설정된 임계영역은 lock 권한을 얻은 하나의 객체만이 독점적으로 사용하게 된다.

 

 

계속해서 꼬리에 꼬리를 물고...

 

 

 

 

트랜잭션과 교착상태

트랜잭션과 교착상태

velog.io

트랜잭션

데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위
반드시 한꺼번에 수행되어야 하는 연산

 

 

- 원자성 (Atomicity)

트랜잭션이 데이터베이스에 전부 반영되거나 전혀 반영되지 않아야 한다.

- 일관성 (Consistency)

트랜잭션의 결과는 항상 일관성이 있어야 한다. 트랜잭션이 진행되는 동안 DB가 변경되더라도 트랜잭션 시작 시점에 참조한 DB로 작업을 수행한다.

- 독립성 (Isolation)

둘 이상의 트랜잭션이 동시에 실행되고 있을 경우, 하나의 트랜잭션은 다른 트랜잭션에 관여할 수 없다.

- 지속성 (Durability)

트랜잭션이 성공적으로 완료되었을 경우, 결과는 DB 에 영구적으로 반영되어야만 한다.

- Commit/Rollback

Commit
트랜잭션이 성공적을 끝났고 DB 가 일관성 있는 상태에 있을 때, 트랜잭션의 결과를 DB 에 반영하기 위한 연산
mysql 에서는 수행했던 트랜잭션이 로그에 저장, 해당 로그를 대상으로 이후 Rollback 연산을 진행 가능
Rollback
트랜잭션이 비정상적으로 종료되어 트랜잭션의 원자성이 깨졌을 경우, 트랜잭션을 처음부터 다시 시작하거나 트랜잭셔을 통 째로 취소한다.

 

 

 

 

 

동시성 제어

다중 사용자 환경을 지원하는 DB 시스템에서 여러 트랜잭션 간의 간섭으로 인해 문제가 발생하지 않도록 트랜잭션의 실행 순서를 제어하는 기법
- 갱신 분실 (lost update)
 트랜잭션들이 동일한 데이터를 동시에 갱신하는 경우에 발생한다.
또는 이전 트랜잭션이 데이터를 갱신한 후 트랜잭션이 종료하기 전에 나중 트랜잭션이 동일한 데이터를 갱신하여 갱ㅅ긴 값을 덮어쓰는 경우에 발생한다.
- 연쇄 복귀 (cascading rollback) or 회복 불가능 (Unrecoverability)
 트랜잭션이 데이터를 공유할 때, 특정 트랜잭션이 이전 상태로 복귀(rollback) 할 경우 아무 문제 없는 다른 트랜잭션까지 연달아 복귀하게 되는 문제.
이 때 한 트랜잭션이 이미 완료된 상태라면 트랜잭션의 지속성 조건에 따라 복귀 불가능
- 불일치 분석 (inconsistent analysis)
 여러 개의 트랜잭션이 동시에 실행할 때 끼어들기로 인해 트랜잭션의 일관성이 유지되지 못하는 상황

 

 

참 많이도 돌아왔네 에휴...

이제 동시성에서 자주 보았던 에러와 함께 생각했던 해결법중 하나인 Lock...

 

 

Lock

동시성제어기법으로, 트랜잭션들이 동일한 데이터 항목에 대해 임의적인 병행 접근을 하지 못하도록 제어하는 것