자동제출 관련해서 발생했던 문제가 동시성의 문제라고 생각하고 여러가지 방법을 시도하게 되었던 것을 내가 시도한것은 아니고 조원분께서 시도했었던 것에 관련해서 작성하는 글입니다..
따라서, 자세하게 적기엔 좀 무리가 있지만... 일단 조금이나마 정리해서 적어보도록 하겠읍디다..
시작하기에 앞서 동시성이란 무엇인가...
동시성(Concurrency)
단순히 사전적 의미로는 어떤 두 사건이 비슷하거나 혹은 같은 의미를 가지고 동시에 일어나는 것 자바에서 보면 한 CPU 에서 동시에 여러 작업을 하는 것처럼 보이게 만드는 것이다. 예로, 하나의 CPU 에서 2개의 프로세스가 있다고 가정하면, 이 둘은 매우 짧은 시간에 컨텍스트 스위치가 일어나 번갈아 실행된다. 그래서 사람이 볼 때 동시에 동작하는 것처럼 보이는 이것이 프로그래밍에서의 동시성을 의미한다. 싱글 코어에서 멀티 쓰레드를 동작 시키는 방식
병렬성(Parallelism)
실제로 동시에 여러 작업이 처리되는 것을 말한다. 2개 이상의 task 가 있을 때, 각 task 가 물리적인 시간으로 동시에 실행이 가능하다는 의미를 가진다. 즉, 여러 코어에서 여러 작업을 동시에 수행하는 것 멀티 코어에서 멀티 쓰레드를 동작시키는 방식
https://seamless.tistory.com/42
synchronized
하나의 객체에 여러 개의 대의 객체가 동시에 접근해 처리하는것을 막기 위해서 사용한다. 보통 메서드의 선언부에 쓰이고 이 키워드가 붙은 메서드는 한 번에 하나의 스레드만 접근이 가능하 메서드가 사용 중일 때 다른 스레드가 메서드를 호출하면 앞의 스레드가 종료될 때 까지 기다려야 한다.
synchronized 로 지정된 임계영역은 한 스레드가 이 영역에 접근하여 사용할 때 lock 이 걸림으로서 다른 스레드가 접근할 수 없게 된다.
이후 해당 스레드가 이 임계영역의 코드를 다 실행 후 벗어나게 되면 unlock 상태가 되어 그때서야 대기하고 있던 다른 스레드가 이 임계영역에 접근하여 다시 lock 을 걸고 사용할 수 있게 된다.
lock 는 해당 객체당 하나씩 존재하며, synchronized 로 설정된 임계영역은 lock 권한을 얻은 하나의 객체만이 독점적으로 사용하게 된다.
데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 반드시 한꺼번에 수행되어야 하는 연산
- 원자성 (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
동시성제어기법으로, 트랜잭션들이 동일한 데이터 항목에 대해 임의적인 병행 접근을 하지 못하도록 제어하는 것