반응형
이전 게시글에서 이어진다.
처음에 forEach로 비동기 처리를 했어서 뭔지 생각을 하다가 이전 게시글을 적게되었고, 이전 게시글의 정보를 통해 DB에 접근하는 시간을 줄이고자, map와 Promise.all을 사용해서 해결하려고 했다.
static async createProfile(profileData: ProfileCreateData) {
const profile = await ProfileDAO.createProfile(profileData); //프로필을 생성함
const promises = profileData.hashTags.map((hashTag) =>
HashTagService.add(hashTag, profile.id)
); //프로필 등록
await Promise.all(promises);
...
}
그러자 이런 오류가 발생했다.
ER_LOCK_DEADLOCK: Deadlock found when trying to get lock; try restarting transaction
HashTagService.add
...
let hashTag = await HashTagDAO.getHashTagProfile(hashTagName);
if (!hashTag) {
hashTag = await HashTagDAO.createHashTag(hashTagName);
}
...
있는지 검사하고, 없으면 추가하게 했는데 이부분이 병렬적으로 실행하면서, select와 insert가 동시에 일어나고, 이때문에 deadlock이 발생했다.
엄청 비슷한 예시를 찾았는데, 아래 글에 현상에 대한 설명이 그림으로 잘 설명되어있다.
https://tecoble.techcourse.co.kr/post/2022-11-01-mysql-dead-lock/
여러가지 해결방법을 제시해주셨지만, DB에 대한 이해가 부족해서(...) Promise.all대신에 for...of문을 사용해서 해결했다.
for (const hashTag of profileData.hashTags) {
await HashTagService.add(hashTag, profile.id);
}
DB는 너무나 어려워...
반응형