문제 상황 이전에 낙관적 락을 이용하여 동시성 이슈를 해결하려고 했습니다. 저희 서비스는 낙관적 락을 이용하면 데드락(Deadlock)이 발생합니다. 그리고 여러 계정이 동시 요청이 왔을 때 성능 저하가 뚜렷합니다. 해결 방법 Like 엔티티 동시성 이슈 해결 Like 엔티티에 유니크 제약 조건을 걸어 Like 엔티티에 값이 중복되어 들어가는 것을 방지하겠습니다. LikeEntity @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Table(uniqueConstraints = { @UniqueConstraint( name = "user_board_post_unique", columnNames = { "user_id", "board_post_id"..
배경게시글 좋아요 로직에 문제가 발생했습니다. 텀을 두고 좋아요를 눌렀을 때 좋아요, 좋아요 취소에는 전혀 문제가 발생하지 않습니다. 동시에 많은 작업이 있을 때 동시성 문제가 발생합니다.좋아요 개수 문제, LikeEntity 중복값 저장 2가지 문제에 대해 다루겠습니다.제가 처음 작성한 로직은 게시글 좋아요 버튼을 누르면 Like Entity save 메서드가 실행이 되고, Like Entity에 값이 존재하면 delete가 되는 로직입니다. 원인 분석 먼저 하겠습니다.원인 분석MySQL 8.0 (innoDB)이며, 트랜잭션 격리 레벨은 디폴트값인 Repeatable Read입니다.게시글A를 찾는 SELECT 과정은 Lock을 얻는 과정이 발생하지 않기 때문에 두 트랜잭션 모두 같은 게시글A에 접근합니..
-INSERT 문 INSERT문의 기본 형식 INSERT INTO 테이블명 [컬럼명] VALUES [값} ex)INSERT INTO dept01 (deptno,dname,loc) VALUES(60,'회계과','서울') insert into STUDENT (name,age,addr,tel) values('홍길동',20,'서울','[02-1212-2323') +만약 컬럼의 순서를 다 알고 있는 상태에서 모든 데이터의 값을 넣으려면 컬럼을 생략하고 밸류의 값만 넣어서 작성할 수 있다. insert into student values ('둘리',30,'부천','032-2222-2222') +강제로 null값을 넣을 수 있따 물론 not null로 설정한 곳에 null을 넣으면 오류 insert into stud..
-테이블 생성 (CREATE) CREATE문의 기본 형식 CREATE TABLE 테이블명 (컬럼명 자료형 제약조건) CREATE TABLE STUDENT( NAME VARCHAR2(20) not null, AGE NUMBER(3), ADDR VARCHAR2(200), TEL VARCHAR2(50) not null ) -서브쿼리를 이용해서 테이블 복사 가능 create table emp02 as (select * from emp) + 테이블을 복사하는 것이 아니라 , 결과를 복사하는 것임 따라서 제약조건은 넣을 수 없다. -원하는 컬럼만 뽑아서 테이블 생성 가능하다. CREATE TABLE emp03 as (select empno,ename,job,sal from emp) -데이터는 빼고 구조만 복사 가능..