skip locked로 동시 실행 막기

Поділитися
Вставка
  • Опубліковано 5 вер 2024
  • DB가 제공하는 skip locked를 이용해서 동시 실행 막는 기능을 만들어 봅니다.
    관련 글 : 동시수정 막기 링크 - • DB 동시 수정 막기 - select …...

КОМЕНТАРІ • 16

  • @patrickjeong1430
    @patrickjeong1430 Місяць тому

    안녕하세요 범균님! 올려주시는 영상 잘 보고 있습니다. (_ _) 현재 프로젝트에서 '메일 전송 기능'을 DB를 이용한 비동기로 구현하였는데요(미완료 메일을 조회하여 전송하는 mail-worker 어플리케이션을 만들었습니다), mail-worker를 scale-out 하는 경우, 중복 처리를 막기 위해 지금 영상과 같이 select...for update skip lock을 이용하면 될 것 같다고 생각했습니다. 그런데 만약, 트랜잭션을 건 상태에서 select for update 로 락을 걸어서 미완료 메일을 조회하여 반복문 처리를 하게 된다면, 반복문에서 에러가 날 경우, Tx 걸린 전체가 롤백 될 수도 있을 것 같은데.. 혹시 이런 경우에는 메세지 큐를 도입해야하는 것이 좋을까요?

    • @madvirus
      @madvirus  Місяць тому +1

      트랜잭션을 2개로 나눠서 진행하시면 될 듯 합니다.
      1. 트랜잭션 범위에서 미완료 상태 메일 목록을 select for update로 조회합니다. 조회할 때 미완료 상태를 처리중 상태로 변경합니다.
      2. 각 처리중 메일을 실제로 발송하고 상태를 '완료' 또는 '실패' 등으로 변경합니다. 이때 1에서 읽어온 전체 목록이 아닌 개별 메일 건을 각각 별도 트랜잭션으로 처리합니다.

    • @patrickjeong1430
      @patrickjeong1430 Місяць тому

      @@madvirus답변주셔서 감사합니다! 많은 도움이 되었습니다.

  • @yaa4500
    @yaa4500 Місяць тому +1

    추가 테이블 없이 하나의 테이블 만으로 동시에 실행되는 케이스를 막기 위해서 여러 생각을 하고있었는데 이번 영상을 보고 해결이 될 것 같습니다. 범균님은 명시적으로 id를 통해서 조회할 수 있었지만 저의 경우는 새로운 job마다 행이 추가 되기 때문에 바로 직전에 성공한 job에 락을 걸어주면 흔히 말하는 따닥이를 방지할 수 있을 것 같네요. 내일 출근해서 바로 테스트 해봐야겠습니다 ㅎㅎ

  • @user-sd3ip7my5x
    @user-sd3ip7my5x Місяць тому

    매번 좋은 영상 감사합니다ㅎㅎ

  • @deniapark761
    @deniapark761 Місяць тому

    상당히 유용한 기능이네요
    오늘도 잘 보고 갑니다!

  • @user-rx9zp1st4y
    @user-rx9zp1st4y Місяць тому

    이걸 미리 알았다면 메시지큐를 이곳저곳에서 많이 쓸필요가 없었을것 같은데... 감사합니다

  • @user-wh6cd6ef1w
    @user-wh6cd6ef1w Місяць тому

    3:50 tryLock 메서드의 select 쿼리와 update 쿼리가 원자적으로 실행되는지를 보장할 수 있나요?

    • @madvirus
      @madvirus  Місяць тому

      DB가 동시 수정을 못 하게 제어해줍니다. 두 쿼리를 한 트랜잭션에서 실힝해야 하구요.

  • @user-hq1dy5gz6v
    @user-hq1dy5gz6v Місяць тому

    범균님, 해당 구문은 특정 DBMS 벤더에만 사용이 가능하지 않나요?

    • @madvirus
      @madvirus  Місяць тому +4

      아, 맞습니다. oracle, mysql(mariadb), postgresql가 지원하는 걸로 알고 있습니다. 물론 지원하는 버전이 있구요.

    • @user-hq1dy5gz6v
      @user-hq1dy5gz6v Місяць тому

      @@madvirus 매번 알찬 영상 감사합니다😊

    • @choi-core
      @choi-core Місяць тому +1

      mysql 8, mariadb 10.6 이에요!

  • @user-wo3vf8xt4d
    @user-wo3vf8xt4d Місяць тому

    잘 봤습니다~

  • @chupinadventure
    @chupinadventure Місяць тому

    와!🎉