안녕하세요 범균님! 올려주시는 영상 잘 보고 있습니다. (_ _) 현재 프로젝트에서 '메일 전송 기능'을 DB를 이용한 비동기로 구현하였는데요(미완료 메일을 조회하여 전송하는 mail-worker 어플리케이션을 만들었습니다), mail-worker를 scale-out 하는 경우, 중복 처리를 막기 위해 지금 영상과 같이 select...for update skip lock을 이용하면 될 것 같다고 생각했습니다. 그런데 만약, 트랜잭션을 건 상태에서 select for update 로 락을 걸어서 미완료 메일을 조회하여 반복문 처리를 하게 된다면, 반복문에서 에러가 날 경우, Tx 걸린 전체가 롤백 될 수도 있을 것 같은데.. 혹시 이런 경우에는 메세지 큐를 도입해야하는 것이 좋을까요?
트랜잭션을 2개로 나눠서 진행하시면 될 듯 합니다. 1. 트랜잭션 범위에서 미완료 상태 메일 목록을 select for update로 조회합니다. 조회할 때 미완료 상태를 처리중 상태로 변경합니다. 2. 각 처리중 메일을 실제로 발송하고 상태를 '완료' 또는 '실패' 등으로 변경합니다. 이때 1에서 읽어온 전체 목록이 아닌 개별 메일 건을 각각 별도 트랜잭션으로 처리합니다.
추가 테이블 없이 하나의 테이블 만으로 동시에 실행되는 케이스를 막기 위해서 여러 생각을 하고있었는데 이번 영상을 보고 해결이 될 것 같습니다. 범균님은 명시적으로 id를 통해서 조회할 수 있었지만 저의 경우는 새로운 job마다 행이 추가 되기 때문에 바로 직전에 성공한 job에 락을 걸어주면 흔히 말하는 따닥이를 방지할 수 있을 것 같네요. 내일 출근해서 바로 테스트 해봐야겠습니다 ㅎㅎ
안녕하세요 범균님! 올려주시는 영상 잘 보고 있습니다. (_ _) 현재 프로젝트에서 '메일 전송 기능'을 DB를 이용한 비동기로 구현하였는데요(미완료 메일을 조회하여 전송하는 mail-worker 어플리케이션을 만들었습니다), mail-worker를 scale-out 하는 경우, 중복 처리를 막기 위해 지금 영상과 같이 select...for update skip lock을 이용하면 될 것 같다고 생각했습니다. 그런데 만약, 트랜잭션을 건 상태에서 select for update 로 락을 걸어서 미완료 메일을 조회하여 반복문 처리를 하게 된다면, 반복문에서 에러가 날 경우, Tx 걸린 전체가 롤백 될 수도 있을 것 같은데.. 혹시 이런 경우에는 메세지 큐를 도입해야하는 것이 좋을까요?
트랜잭션을 2개로 나눠서 진행하시면 될 듯 합니다.
1. 트랜잭션 범위에서 미완료 상태 메일 목록을 select for update로 조회합니다. 조회할 때 미완료 상태를 처리중 상태로 변경합니다.
2. 각 처리중 메일을 실제로 발송하고 상태를 '완료' 또는 '실패' 등으로 변경합니다. 이때 1에서 읽어온 전체 목록이 아닌 개별 메일 건을 각각 별도 트랜잭션으로 처리합니다.
@@madvirus답변주셔서 감사합니다! 많은 도움이 되었습니다.
추가 테이블 없이 하나의 테이블 만으로 동시에 실행되는 케이스를 막기 위해서 여러 생각을 하고있었는데 이번 영상을 보고 해결이 될 것 같습니다. 범균님은 명시적으로 id를 통해서 조회할 수 있었지만 저의 경우는 새로운 job마다 행이 추가 되기 때문에 바로 직전에 성공한 job에 락을 걸어주면 흔히 말하는 따닥이를 방지할 수 있을 것 같네요. 내일 출근해서 바로 테스트 해봐야겠습니다 ㅎㅎ
매번 좋은 영상 감사합니다ㅎㅎ
상당히 유용한 기능이네요
오늘도 잘 보고 갑니다!
이걸 미리 알았다면 메시지큐를 이곳저곳에서 많이 쓸필요가 없었을것 같은데... 감사합니다
3:50 tryLock 메서드의 select 쿼리와 update 쿼리가 원자적으로 실행되는지를 보장할 수 있나요?
DB가 동시 수정을 못 하게 제어해줍니다. 두 쿼리를 한 트랜잭션에서 실힝해야 하구요.
범균님, 해당 구문은 특정 DBMS 벤더에만 사용이 가능하지 않나요?
아, 맞습니다. oracle, mysql(mariadb), postgresql가 지원하는 걸로 알고 있습니다. 물론 지원하는 버전이 있구요.
@@madvirus 매번 알찬 영상 감사합니다😊
mysql 8, mariadb 10.6 이에요!
잘 봤습니다~
와!🎉