오래 기다리는 경우보다는 너무 빨리 (5초 안에) 등록버튼을 연타했을 때 저런 문제가 생긴다고 알고 있습니다. 첫번째 댓글이 등록 완료되기도 전에 두번째 댓글을 등록하려고 시도하니까, 애드온에서 같은 내용으로 이미 등록된 댓글이 있는지 찾아보려고 해도 안 나오는 거죠.
댓글 등록시 알림 전송 등 처리해야 할 일이 많은 사이트일수록, PHP 기본 세션이 아닌 DB 세션이나 memcached 세션을 사용하는 사이트일수록, 그리고 InnoDB를 사용해서 트랜잭션 처리가 되는 사이트일수록 이런 문제가 심합니다. 트랜잭션이 완료되기 전에는 다른 요청에서 현재 등록중인 댓글을 볼 수 없거든요.
댓글 30
이거 이미 오래전에 깔아두었는데
제 사이트에는 계속 2개 올라옵니다.
이상하게 저는 재현을 하려고 해도안되는데 회원들은 어찌그리 2개씩다는지.. ㅠ
등록한 시간이.. 한시간이 아닙니다. 같은 분이죠.
누가 한시간을 기다렸다가 ㅎㅎㅎ
제 사이트와 호환이나 기타등이 안되어서 다른 해결책을 찾고 있는 겁니다.
생각해보니 익스 하위버전에서 해당문제 생기는지 봐야겠네요.
제가 발견되는 족족 지워서 잘없는데
하루에 2~3회정도 이런일이 발생하네요.
코드상에 문제가 없지만 뭔가 서버나 프로그램상의 충돌이나 문제점이 발생하나봅니다.
오래 기다리는 경우보다는 너무 빨리 (5초 안에) 등록버튼을 연타했을 때 저런 문제가 생긴다고 알고 있습니다. 첫번째 댓글이 등록 완료되기도 전에 두번째 댓글을 등록하려고 시도하니까, 애드온에서 같은 내용으로 이미 등록된 댓글이 있는지 찾아보려고 해도 안 나오는 거죠.
댓글 등록시 알림 전송 등 처리해야 할 일이 많은 사이트일수록, PHP 기본 세션이 아닌 DB 세션이나 memcached 세션을 사용하는 사이트일수록, 그리고 InnoDB를 사용해서 트랜잭션 처리가 되는 사이트일수록 이런 문제가 심합니다. 트랜잭션이 완료되기 전에는 다른 요청에서 현재 등록중인 댓글을 볼 수 없거든요.
댓글로 첨부를 하는경우는 잘 없으니 댓글 2번클릭 시 페이지가 새로고침 되면 조금 나을 지도 모르겠네요.
감사합니다.
바쁘시겠지만 문제될만한 요소가 있는지.. 살펴봐 주실수 있으실까요? 주소는 쪽지로 드릴 수 있습니다.
그럼 저희 처름 한번 클릭 후 10초 정도는 클릭이 안먹게 해 두면 애드온으로 완벽 하겠네요. 밑에 댓글 보고 또 제가 달고 생각해보니 저희 사이트에서는 한번 클릭 후 10초 여유가 있어 절대 등록이 안되는 것 같습니다.
그런데 한번 클릭 후 다시 클릭 안되도록 처리 안한 스킨에서도 빠르게 등록하려고 해도 등록이 안되는거 보면 서버의 처리시간 차이도 영향이 있을 듯 합니다.
저는 이중 등록해보려고 노력해봐도 애드온에서 막히네요. 10초 동안 버튼 먹통 만들지 않은 스킨으로 테스트해도 절대 이중 등록이 안되요 ㅋ
일부러 오래된 글 찾아가면 느리게 뜰까봐 그렇게도 해봤는데 재현이 안됩니다. ㅎㅎ 미칠 노릇이네요.
같은 댓글 3개씩 달리면 괜히 서버자원 아깝다 느껴지더라구요~
아.. 다시 생각해보니.. 코어에서 3초정도는 블럭을 해버리니.. 3초 이상에서 중복 클릭하면 이전 글 등록이전일 수도 있어 이중 등록 될 듯 합니다.
저희 처럼 10초 버튼 무력화 이게 답이네요. 저희가 테스트 하는 방법은 3초 이내에 클릭이라 코어에서 막혀요.
서버가 조금 느리면서 && 유저가 3,4초 사이 중복 클릭하면 가능성이 많이 잇네요.
-> 10초 무력화로 시간 더 늘리면 되겠습니다.
등록버튼을 스크립트에 맞춰서 조금 변형하구요. 아래 스크립트는 댓글 등록폼 하단에 넣어주시면 됩니다.
이게 댓글이니 글 등록도 비슷하게 하시면 됩니다.
<script>
function beCheckWrite(obj){
var delaytime = 10000, // 몇초 후 재활성화 해줄 건지 설정 1000 = 1초
submingText = '등록중..', // 클릭했을 때 보여줄 멘트..
ori_text = jQuery(obj).val(),
checkInput = false;
//button 인지 submit인지 체크..
if(!ori_text){
checkInput = false;
ori_text = jQuery(obj).text();
}else{
checkInput = true;
}
//현재 버튼 이름이 submingText와 동일한 경우 전송중으로 판단 전송하지 않음.
if(ori_text == submingText) return false;
//우선 비활성화를 한다.
//obj.disabled=true;
//기존 멘트를 바꿔준다.
if(!checkInput){
jQuery(obj).text(submingText);
}else{
jQuery(obj).val(submingText);
}
// 설정한 시간이 지나면 다시 활성화
setTimeout(function(){
if(checkInput) jQuery(obj).val(ori_text);
else jQuery(obj).text(ori_text);
},delaytime);
return true;
}
</script>
그리고 스케치북 스킨 쓰시면 댓글쓰기 대댓글쓰기 댓글수정 모두 하셔야 할겁니다.