본문 바로가기

DB/MySQL4

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.
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.
Real MySQL 04 서버 아키텍처 (1) - MySQL 서버는 MySQL 엔진과 스토리지 엔진으로 이루어져 있음 MySQL 엔진 - 커넥션 핸들러 : 클라이언트의 접속과 쿼리 요청을 처리함 - SQL 파서, 전처리기 - 옵티마이저 : 쿼리 최적화 담당 스토리지 엔진 - 실제 디스크 스토리지에 데이터 저장 - 디스크 스토리지로부터 데이터 읽어오기 MySQL 엔진은 하나지만, 스토리지 엔진은 동시에 여러개 사용 가능 테이블 생성 시 다음과 같이 스토리지 엔진을 지정할 수 있다. 해당 테이블에 대한 읽기, 변경 작업은 지정된 스토리지 엔진으로 처리하게 된다. CREATE TABLE test (id INT, name VARCHAR(30)) ENGINE=INNODB; - MySQL 엔진이 스토리지 엔진에서 데이터를 읽어오거나 저장하기 위해 핸들러를 거친.. 2022. 3. 7.