프로그래밍

DB에 저장된 특정 값을 증가나 차감시키는 update 쿼리는 어떤식으로 만들어야함??

단순 쿼리문이면 모르겠는데 조회수/추천수나 제품 수량이나 누적 포인트 차감 처리같이 사용자가 동시적으로 요청이 오는 서비스안에서는 lock이 걸릴텐데 이를 회피하려면 캐시말곤 답이 없나?

 

lock걸린다고 로직 수정이 필요하다는데 뭘 어케 해야하는지 감이 안잡힘;;

 

조회수나 추천수 같은거야 뭐 느슨하게 가도 상관없지만 지금 하는건 돈이랑 관련된 작업이다보니 느슨하게 잡을 수도 없고 ...

 

lock안걸리게 update 동시성 제어 하는방법은 없나?

20개의 댓글

2023.12.11

https://sqlfordevs.com/concurrent-updates-locking

0
2023.12.12
@개심심함

포인트는.. 잘모르겟네

0
@개심심함

insert작업때 pk충돌나면 값 업데이트 처리시키는걸로 카운트 누적시키게끔 한거네 ㅋㅋㅋㅋ 저런식으로도 되는구나

 

지금 상황하고는 안맞긴한데 그래도 좋은거 알아간다

 

난 저렇게 써볼 생각도 못해봄 ㅋㅋㅋ

0
2023.12.12

포인트 차감은 그냥 update 한번 하고 끝나는거 아님? update 할때는 당연히 해당 row에 lock이 걸리는거고, 다만 update 1건 같은 가벼운 작업은 lock 걸려있는 시간이 거의 없을테니 lock 걸려도 상관없는거고. 아니면 너무많은 여러개 작업이 하나의 트랜잭션으로 묶여서 처리돼서 lock 걸리는시간이 오래걸린다 이말인거야?

0
@무쳐

뭐 이벤트할 때 예산 제한 걸어두고 예산 소진되면 이벤트 종료 처리한다게 있잖아 여기서 일정 예산 금액 안에서 포인트를 제공해준다 할 때 테이블에 저장된 전체 예산을 차감시키거나 제공했던 포인트를 합산시키거나 하는 일을 말하고 싶었음

0
2023.12.12

이벤트를 쌓아,,,,, 그리고 이벤트 갯수로 통계를 내,,,,

2
@dsada12345

이벤트를 쌓는다는게 다른 테이블에 값을 쌓는걸 말하는거?

0
2023.12.12
@저소음흑축써주세요제발

이벤트주도 아키텍처 검색해봐

0
@dsada12345

ㄱㅅㄱㅅ

0
2023.12.12

테이블 구조가 어떤지는 몰겠는데

상품별로 데이터가 쌓이고, 그 상품의 조회수 컬럼을 update 하는게 목적이라는거 맞음?

근데 그게 lock이 걸리니 다른 방안을 제시하라는거고?

 

부하가 어느정도인지는 몰겟는데, 단순 조회수같은 수치는 그냥 임시테이블 하나 만들어서 insert 하고

job같은거로 주기적으로 집계 -> update -> delete 하면 안됨?

 

그리고 그 전에, 한줄 update 하는게 db 전체에 부하를 줄건 없을건데?

보통 한 줄 update 할땐 row level rock 이라 다른 row update에 영향 안주고, 수행시간 자체도 미리세컨단위라 그게 왜 문제라는건지 사실 잘 몰겠넹

1
2023.12.12
@Erino

물론 dbms에 따라 lock 걸리는 기본 설정 차이가 좀 있으니 참고하구...

0
@Erino

개인적으론 설계부터가 문제라고 보고있는편이긴함...

 

구조가 예산을 관리하는 테이블이 하나뿐이고 총 예산 안에서 사용자에게 포인트 제공을 하는 방식인 서비스인데

 

포인트 제공할 때 마다 예산에서 제공된 포인트만큼 차감시키는 업데이트 쿼리를 단순하게 짠 형태거든

0
2023.12.12
@저소음흑축써주세요제발

조회수, 추천수같이 신뢰도가 낮아도 되고 중요하지 않은 정보면 위에 작은대로 집계내서 분단위든 초단위든 한번에 update 하는식으로 해도 될겠지만

 

그런 포인트같이 신뢰도가 높아야하고 실시간성이 중요한거는 테이블에서 바로바로 update 해야하는게 맞다고 봄

 

다만, 그 테이블에 인덱스가 많이 설정되어있거나 데이터 자체가 많아서 느린게 문제가 되는 경우라면, 임시 테이블을 하나 별도로 만들어서 그 테이블에 포인트 관련 데이터를 하나 넣고, 그 테이블을 바라보도록 하면 훨씬 빠르게 운영할 수 있지 않을까?

그리고 그 임시 테이블에 있는 데이터 값도 주기적으로 본 테이블로 옮겨주고..

 

만약 단순한 테이블 부하 문제거나 db 설정으로 row level lock이 아니라 table level lock을 걸고 있는거면 이정도 조치로 해결 가능할거임

1
@Erino

고맙다... 내부적으로도 더 알아보긴 해야할듯...

0
2023.12.12

게임 개발자인데, 이런 경우는 당연히 공유 자원에 접근할 때마다 lock 걸었다 풀었다 하는게 맞지 않음?제품 수량같은 경우 유저가 동시에 접근하게 될 경우가 많을 텐데, lock 자체를 안 할 생각보다 설계를 유연하게 하는 게 더 맞을 듯? 예를 들어 특정 제품을 장바구니에 넣어놓고 결제 단계로 넘어가는 버튼을 누를 경우 우선 제품 수량을 lock 걸어서 안전하게 차감시키고 바로 풀어버리는 거지. 이렇게 되면 유저가 결제창에서 필요한 정보를 입력하는 동안 다른 유저가 안전하게 장바구니에 담거나 할 수 있게 될 듯.

만약 이런 게 아니라 진짜 멀티스레딩으로 공유 자원에 마구잡이로 접근이 가능할 수 있는 방법이 이론상 존재한다면 알려주세요

0
@덕덕고

나도 좀 당황스럽다. 저런걸로 락 피하게 로직 변경을 해달라는게...

 

그냥 해달라고만 하고 힌트도 안줌 ㅋㅋㅋㅋ

 

그래서 다른 서비스에선 지금 하는거랑 비슷한 로직은 어떻게 하는지 좀 알아봐야할듯

0
2023.12.12

추천 수를 디비에 저장하려면 비관적 락 걸수밖에 없는거 같은데… 아니면 위에 답처럼 이벤트 자체를 저장해서 필요할때마자 카운트하던가

0
@classica33

이벤트 쌓는다는게 다른 테이블에다가 증가나 차감시킬 데이터를 쌓아두는걸 말하는거야?

0
2023.12.12
@저소음흑축써주세요제발

ㅇㅇ 대충 누가 언제 엄지척 함! 이런거 기록한거

0
2023.12.12
@저소음흑축써주세요제발

포인트 관리라묜 포인트 증감 값을 매번 기록하고 필요할때 디비에서 로우 다 가져온다음에 합계하는거지.

 

락을 절대 못 쓰게하면 이렇게 해여지 뭐

0
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜 조회 수
5694 [프로그래밍] 아 시발 퇴사마렵다 9 인간지표 0 17 시간 전 278
5693 [프로그래밍] C#이 ㅈ사기 언어인 이유 17 ye 4 1 일 전 777
5692 [프로그래밍] 요즘 모바일 개발은 어떤 걸 사용하나요? 13 커피좋아용 0 3 일 전 333
5691 [프로그래밍] 취준생 안드로이드 팀플 주제 머할까요... 8 조강현 0 3 일 전 229
5690 [프로그래밍] 공통코드테이블은 대체 왜 만드냐 9 잠적자 0 5 일 전 429
5689 [프로그래밍] 토이프로젝트 주제 선정 3 개드립눈팅1세대 0 5 일 전 229
5688 [프로그래밍] 엥 구글 플러터 유기각 재는거임?? 4 최수연 0 7 일 전 361
5687 [프로그래밍] 반도체 장비 업계인 있음? 9 캡틴띠모 0 8 일 전 296
5686 [프로그래밍] 안드로이드 책 추천좀 6 집에가게해줘 0 9 일 전 159
5685 [프로그래밍] 폰 스크리닝 해 본 사람 있어? 3 무지개빛푸딩 0 9 일 전 395
5684 [프로그래밍] jsp 트리메뉴 만들고있는데 구상한게가능한지 의견좀물어볼께 11 평택국 0 10 일 전 176
5683 [프로그래밍] JPA 도와줘어억 ㅠ 10 모그리또 0 10 일 전 266
5682 [프로그래밍] 의사는 뽑는 인원 제한하는데 부캠은 왜 제한 안 할까 5 조강현 0 12 일 전 381
5681 [프로그래밍] 그 혹시 게임쪽 종사자 있음? 17 god79ii 0 16 일 전 639
5680 [프로그래밍] 코린이 ㅅㅂ 뭐가 문젠지 모르겠어요 9 집에가게해줘 0 16 일 전 464
5679 [프로그래밍] Dear Imgui 라고 아시나요? 2 년째모쏠 0 16 일 전 250
5678 [프로그래밍] 현업개발자분들 주말엔 편하게 쉴수있나요? 10 키로 0 17 일 전 888
5677 [프로그래밍] 무엇이든 물어보세요. 28 변현제 0 19 일 전 423
5676 [프로그래밍] 개발자보단 엔지니어가 취업이 잘됨 5 iillillill 2 20 일 전 768
5675 [프로그래밍] 프론트엔드 개발자 연봉 1억 넘는 사람 있어? 13 잠적자 0 20 일 전 668