- [ backend/삽질일기 ][spring] 분산락을 걸어도 동시성 문제가 발생한다?! (feat. 트랜잭션 AOP)2024-12-12 21:50:19🔗 [redis] redisson으로 분산락 걸어서 동시성 문제 해결하기 (근데 해결 안됨)때는 분당으로 교육 가던 길.. 갈 길도 멀고 가방이 무거워 노트북을 가져가지 않았다. 근데 아침 7시부터 슬랙 알림이 100개 넘게 왔다. (😈 : 어? 노트북 두고 간다 장애각이다) 앱 진입 시점에 사용하는 API + 사용자의 포기하지 않는 인내심이 합쳐져 팀원들한테 슬랙 알림 테러를 시작했다.해당 포스팅에서 처리한 줄로만 알았던 데이터베이스 동시성이 원인이었다. 우리 서비스는 하루에 한 번만 미션 인증을 할 수 있는데 Repeatable Read 격리 수준이 INSERT 작업을 예방할 수 없어 API를 빠르게 연달아 호출하면 여러 번 인증하는 것이 가능했다.이러한 동시성 문제를 막고자 분산락을 적용했고 잘..
- [ backend/데이터베이스 ][redis] redisson으로 분산락 걸어서 동시성 문제 해결하기2024-11-19 12:00:41Repeatable Read 격리 수준으로 인한 동시성 문제 발생내가 진행중인 프로젝트에서 동시성 문제가 발생했다. 요구사항에 의해 하루에 한 번만 미션을 수행할 수 있다. 이를 위해 미션 인증 레코드를 생성하기 전에 오늘 인증 내역이 있는지 확인하고 INSERT 쿼리를 수행한다.@Transactionalpublic void createVerification(final CreateMissionVerificationCommand command) { MissionMember missionMember = missionMemberRepository.getMissionMember(command.memberId(), command.missionId()); // 유효성 검사 진행 (이미 레코드가 있는 경우..
- [ 학습기록/CS 공부 ][DB/쉬운코드] 트랜잭션과 동시성 제어 (ACID/이상 현상)2024-05-03 17:06:02트랜잭션J가 H에게 20만원을 이체하는 상황을 SQL문으로 작성해보면 위와 같다. 이체 작업은 두 SQL문이 모두 성공해야만 성공한다. 즉, 하나라도 실패해서는 안된다. 트랜잭션은 하나의 논리적인 작업 단위를 의미한다. 즉, 논리적인 이유로 여러 SQL문을 단일 작업으로 묶어서 처리해야 하는 것을 의미한다. 위 이체 작업을 트랜잭션으로 처리하면 일부만 성공해서 DB에 반영되는 일이 일어나지 않는다.START TRANSACTION; /* 트랜잭션의 시작 (= AUTOCOMMIT 비활성화) */UPDATE account SET balance = balance - 200000 WHERE id = 'J';UPDATE account SET balance = balance + 200000 WHERE id = 'H'..
- [ backend/데이터베이스 ][mysql] 성능 최적화 2편 (트랜잭션)2024-02-06 20:39:51트랜잭션 최적화 트랜잭션은 데이터의 일관성과 안전성을 보장하는 핵심 요소다. 특히 다수의 데이터를 처리할 때 트랜잭션 범위를 어떻게 설정하느냐가 성능에 큰 영향을 미친다. 하지만 다수의 쿼리를 하나의 트랜잭션으로 처리하는 것이 반드시 성능 향상으로 이어질까? 한 트랜잭션에서 여러 쿼리를 처리하면 커밋이나 롤백이 발생하기 전까지 모든 변경사항이 보류된다. 그동안 다른 트랜잭션들이 해당 데이터에 접근하지 못하고 기다려야 하므로 트랜잭션의 처리 속도가 감소할 수 있다. 🚨 대량의 행을 삽입/수정/삭제한 후 롤백을 실행하는 것은 성능을 저하시킬 수 있다. 대규모 데이터 변경이 필요한 경우, 주기적으로 커밋을 실행하거나 작은 크기의 트랜잭션으로 나누는 것이 좋다. 한편, 각각의 쿼리를 개별적인 트랜잭션으로 처리하..
- [ 학습기록/CS 공부 ][DB] 트랜잭션 (ACID/격리 수준)2024-02-05 03:09:44트랜잭션이란? 트랜잭션은 작업의 단위를 의미한다. 트랜잭션은 일관적이어야 하며 다른 트랜잭션에 고립적이어야 한다. 시스템 장애가 발생해도 올바르게 복구하여 데이터베이스의 일관성을 유지해야 한다. 데이터베이스에 동시에 접근하는 프로그램들을 격리시켜야 한다. 트랜잭션은 논리적인 작업의 단위로, 다수의 연산(쿼리)으로 구성될 수 있다. ACID 트랜잭션은 완전히 반영되거나 아예 반영되지 않아야 하고 (원자성) 기존 제약조건을 변경하지 않아야 하며 (일관성) 다른 트랜잭션에 영향을 미치지 않아야 한다. (고립성) 그리고 한 번 변경된 사항은 영구적으로 유지되어야 한다. (지속성) ACID 속성을 보장하기 위해서는 강력한 로깅 시스템이 트랜잭션을 적절하게 처리할 수 있어야 한다. atomicity 트랜잭션 내의 ..