2009-09-15 10 views
0

나는 내 테이블 A에 열라고보기는 내가 그렇게 같은 전망을 열 증가 할 있습니다MySQL의 증가 값 - 미스 때로는

UPDATE A set views = views + 1 WHERE ID = blabla LIMIT 1; 

이 그것을 할 수있는 방법처럼 보인다 (?)를 적어도 나에게. 또는 그렇게 생각했습니다.

는 (PHP에서) 내가 할 때처럼 보인다 :

$views = get_viewcount($id); 
$views++: 
save_viewcount($id, $views); //here we just update views with the $views variable 

이 항상 작동합니다. 그러나 get_viewcount를 사용하여 DB에 추가 왕복을 가한 다음 PHP에서이를 증가시키고 다시 전송합니다. 그것은 항상 작동합니다.

"때때로"위의 SQL 문이 작동합니다. 나도 알아 - 나는 때때로 프로그래밍에서 "때로는"이라는 단어를 싫어한다. 그러나 다른 방식으로 말해서 나는 WHEN이라고 말할 수는 없지만 한 번에 SQL로 직접 할 때 증가하지는 않는다.

제안 사항?

+1

이상하게 보입니다.실제로 SQL이 더 잘 작동 할 것으로 기대합니다. PHP에 동시성 문제가 있습니다 (다른 사용자 요청이 줄 1과 줄 3 사이에 오면 어떻게 될까요?). –

+0

여기에는 잘못된 동시성 문제가 있습니다. 이 문제는 수정해야합니다. – spender

답변

2

시스템의 버그를 격리해야합니다. 은 MySQL에서 문제가 될 가능성이 매우 낮습니다.

많은 테스트를 수행하고 데이터베이스 로그 등을 보는 것이 좋습니다. 시스템의 일부 논리 또는 요청 전에 죽거나 끝나는 경우 쿼리가 실행되지 않을 가능성이 가장 큽니다 쿼리에 도달했습니다.

+0

확인. 감사. 난 그냥 내가 사용하는 SQL이 어떤 식 으로든 평범하지 않았 으면 좋겠다. 이제 적어도 - 내 편에는 분명히 버그가 있다는 것을 알고 있습니다. 감사합니다. 둘 다 대답합니다. – adergaard

2

뭔가 잘못하고 있어야합니다.

당신이 MySQL을 말할 경우 :

UPDATE foo SET views = views+1 WHERE id = 1337; 

을 증가시킬 것이다.

명령 줄에서 사용해보십시오.

SQL을 실행하는 데 사용하는 코드는 모두 실패한 것이지만 SQL 문 자체는 실패합니다.

그리고 UPDATE 쿼리에서 LIMIT = 1은 무엇입니까?

+0

업데이트 쿼리에서 한계점 1은 일반적으로 당신이 바보 같은 일을하는 것을 막습니다.'UPDATE 사용자 SET is_superuser 1 WHERE some_complicated_condition OR 1 = 1' 또는 유사합니다. 'LIMIT 1'을 사용하면 적어도 1 줄의 피해를 완화 할 수 있습니다. –

+0

먼저 답해 주셔서 감사합니다. 나는 누군가에게 대답을 수여해야했고 이번에는 다른 남자를 골랐다. 고마워요. "제한 1"은 Dominic이 위에서 말한 것과 매우 흡사합니다. 단지 안전 예방 조치 일뿐입니다. – adergaard

+0

그 말이 맞는 것 같아요. 그것은 보안에 대한 잘못된 인식처럼 보입니다. 일이 잘못 될 경우, 나는 그들이 잘못 * 큰 소리로 * 가고 싶다. 그래서 나는 그것에 대해 알고있다. – timdev

0

필자가 권장하는 것은 실행중인 쿼리, 돌아 오는 결과 등을 에코하도록 PHP를 설정하는 것입니다. 가능한 모든 작업을 수행 할 수 있습니다. 적용 가능한 경우 SQL 로그를보고 어떤 테이블에서 어떤 조회가 실행 중인지 확인하십시오. 기본적으로 정확히 을 볼 필요가 있습니다. 여기에서은 오류 지점입니다.

SQL 문이 가끔 작동한다고 말하면 코드에서 호출되거나 mysql을 통해 호출되는 경우 (사용중인 것으로 가정) 프롬프트가 표시됩니까? 이전 버전 인 경우 명령 프롬프트에서 코드를 실행하여 코드와 동일한 결과를 얻으려고 했습니까? 그렇지 않으면 데이터베이스를 제외하고 코드를 구체적으로 살펴볼 수 있습니다.

행운을 빈다.

0

BEGIN TRANSACTION/COMMIT 처리가 수행되는 위치와 시점을 살펴 봅니다.

SQL 리턴 코드를 확인하지 않고 "DEADLOCK"경고가 누락되었을 수 있습니다.