같은 옵션에 경쟁을 붙이면 어떻게 될까?

옵션 테이블의 업데이트 실패 재현하기

업데이트가 정말 실패하는지, 그러면 왜 실패하는지를 알아보도록 하겠습니다. 실험을 위한 플러그인 코드를 github gist 에 올려 두었습니다. 각자의 개발용 워드프레스에 설치해 실험해 보세요.

플러그인을 활성화하면 RCond 라는 메뉴가 하나 생깁니다. 여기에 ‘Autoload Yes’와 ‘Autoload ‘No’라는 섹션이 하나 있습니다. 이 예제에서 실행하는 바는 다음과 같습니다.

  • 각 섹션에서 ID 1 ~ 50까지 AJAX 요청을 실행합니다.
  • AJAX 요청을 맡은 콜백에서는 해당 ID를 받아 옵션 테이블에 기록합니다. 이 때 옵션 하나에 ID를 배열로 기록해 저장합니다.
  • 옵션 테이블에 기록된 ID는 ‘clicked’라고 출력되며, 새로고침해도 이 기록은 유지될 것이라 기대합니다. 이미 옵션 값에 해당 ID를 기록해 두었다가 출력 전에 ID의 존재 여부를 체크하기 때문입니다.
  • 화면 맨 아래에는 모든 요청을 초기화하는 버튼이 있습니다. 이 버튼을 누르면 ID를 기록한 내역을 초기화하고 화면을 새로고침합니다.
  • Autoload Yes 섹션과 Autoload No 섹션의 역할은 위의 사항과 같이 동일합니다. 그러나 이런 차이가 있습니다.
    • Yes 섹션과 No 섹션은 ID를 각자 서로 다른 옵션에 저장합니다.
    • Yes 섹션은 update_option() 호출시 autoload = ‘yes’로, No 섹션은 autoload = ‘no’로 기록합니다.
  • 각 섹션마다 1~50개의 ID를 동시에 클릭해서 한꺼번에 AJAX 호출을 50개 일으키는 링크를 가지고 있습니다. 이 실험의 핵심입니다.

여기서 각 섹션의 ‘모두 동시 클릭’을 클릭하면, 50개의 ID 기록이 연달아 요청될 것입니다. 즉 빈번한 update_option() 호출이 일어나리라 기대할 수 있겠지요. 그러면 어떻게 될까요?

해당 실험을 한 영상을 찍어 보았습니다. 여러분들도 비슷한 현상이 일어날 것입니다.

영상에서 각 섹션마다 50개의 AJAX 요청을 한번에 보내는 것을 볼 수 있습니다. 각 항목을 클릭하면 항목마다 정상적으로 ‘clicked’라고 표시되는 것을 볼 수 있습니다. 처음에 나오는 ‘clicked’라는 메시지는 자바스크립트에 의해 무조건 출력되는 거라 빠짐없이 나옵니다.

그러나 페이지를 새로고침하면 앞선 화면과는 다릅니다. 아래는 각 섹션마다 결과를 갈무리한 그림입니다.

autoload=’yes’
autoload=’no’

오토로드를 지정한 쪽은 7개 정도만 ID를 제대로 기록하였습니다. 오토로딩을 지정하지 않은 쪽은 좀 더 많이 ID를 기록했습니다만, 그래도 업데이트 중 6개의 데이터가 유실되었습니다. 둘 다 50개의 ID를 경쟁적으로 업데이트 시켰을 때 안정적으로 데이터를 유지하기 어려워 보입니다.

댓글 남기기