본문 바로가기

DB5

deadlock found when trying to get lock 에러 해결 deadlock found when trying to get lock 에러가 나는 케이스는 실제로 deadlock이 걸렸을 때, 혹은 lock을 걸고 수행하는 트랜잭션이 끝나지 않았을 때 바로 같은 row에 lock을 걸려고 할 때 나타난다. 따닥과 같은 api 중복 요청 시에도 발생했고 최근에는 SQS로 받은 event를 처리하는데 event가 연속으로 날라와서 거의 동시에 처리할 때 에러를 마주했다. 두 개의 다른 event payload가 다른 row에 대해 처리함에도 불구하고 에러를 마주했다. 로직 안의 update문에서는 인덱스를 걸지 않은 컬럼을 where절에 사용했고 따라서 row 전체에 lock을 걸어서 발생한 문제였다.id값을 조회해서 where절에 id를 넣어주는 것으로 해결할 수 있었다. 2024. 7. 16.
오랜만에 MySQL 접속하니 마주한 에러들 해결 정리 회사 맥북으로 MySQL을 사용하다가 내 맥북으로 새로운 프로젝트를 시작하기 위해서 MySQL 서버에 접속하려고 하니 여러 에러들을 마주했다. 1. sudo로 접속해도 mysql 서버에 접속되지 않는 문제 (비밀번호를 설정했는데 틀린 비밀번호로 접속해서 발생한 문제 같았음) 2. 터미널로 mysql 서버에 접속하는데 자꾸 호스트가 jdbc:mysql://localhost 로 설정되어서 Unknown MySQL server host 라는 에러 메시지가 나왔다. 해결 방법을 정리하자면, 1. 해결 sudo로 접속해도 mysql 서버에 접속되지 않는 문제 mysql 서버를 실행할 때 --skip-grant-tables 라는 옵션을 준다. 아래 명령어를 순차적으로 실행하면 된다. mysql.server stop.. 2023. 3. 29.
clustered index와 non-clustered index DB에서 테이블의 데이터 레코드를 저장하는 방식 clustered index PK가 clustered index 임 데이터는 물리적으로 clustered index의 순서대로 정렬되어 저장된다. 탐색 속도가 non-clustered index에 비해 빠르다. 삽입, 삭제는 데이터의 물리적인 순서가 바뀌기 때문에 non-clustered index 보다 느리다. clustered index는 테이블 당 하나만 가질 수 있다. non-clustered index 무결성 제약조건이 걸린 복합키가 non-clustered index에 해당된다. 테이블 당 여러개를 가질 수 있다. 인덱스에는 인덱스를 건 컬럼과 데이터의 주소를 가지고 있다. 인덱스를 적용한 컬럼을 기준으로 새로운 테이블이 생성된다. 그 컬럼을 기.. 2023. 2. 22.
case when exists 값이 있는지 없는지 여부를 조건으로 두고 싶을 때 사용 가능 order by에도 쓸 수 있음 A테이블의 id를 참조하고 있는 B테이블에 row가 있는지 여부로 A테이블을 정렬할 때 다음과 같이 사용 가능 order by case when exists (select 1 from table_B where table_B.table_A_id = table_A.id) then 0 else 1 end 2022. 3. 27.