트래픽이 몰릴때 로그를 살펴보면
아래와 같은 쿼리가 있는 곳에서 대부분 lockwait 나 lock획득을 못하는 지연이 발생되는데요
기술적으로 원인을 잘모르겠습니다.
쿼리 예시)
UPDATE PRODUCT
product_ea = product_ea - #{param_ea}
WHERE product_code = 'CODE1234';
혹시나 해서 저 product_ea값을 아래와 같이 미리 계산해서 update에 적용하니
문제점이 해결된거 같기도 한데요.
<selectKey keyProperty="preProductEa" resultType="java.lang.Integer" order="BEFORE">
SELECT IFNULL(product_ea , 0) + IFNULL(#{param_ea}, 0)
FROM PRODUCT WHERE product_code = 'CODE1234';
</selectKey>
UPDATE PRODUCT
product_ea = #{preProductEa}
WHERE product_code = 'CODE1234';
업데이트 구문에서 이런부분이 문제가 되는 이슈가 있을까요? ( MYSQL )
oracle에서는 별문제 없었던거 같기도 하고.
조언좀 부탁드립니다
직접 변경 방식에서 조회 후 변경하는 방식으로 바꾼 건데요.
조회와 변경 그 사이에 다른 곳에서 먼저 값을 바꿔 버리는 경우가 있을 수 있는데
이렇게 되면 잘못된 값으로 변경될 가능성이 있습니다.
답변 감사드립니다.
분리가 되어 있어도 한트랙잭션 안이라서
해당 행은 쉐어락이 걸리지 않을까 생각했었는데..
다른 해결법을 고민해 봐야하겠네요 ㅠ