가끔 모든 필드를 업데이트하고 때로는 하나만 제외하고 모든 필드를 업데이트하는 mySQL 업데이트 쿼리가 있습니다.업데이트 쿼리가 때때로 데이터베이스의 필드를 업데이트하지 않습니다.
통화 중 약 10 %가 실패합니다.
내 테이블은 다음과 같습니다
CREATE TABLE IF NOT EXISTS `grades` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`state` int(1) NOT NULL,
`result` varchar(255) NOT NULL,
`date_synced` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`))
ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4395 ;
내 쿼리는 다음과 같습니다
$sqlstr = "UPDATE grades SET result = '$result', state = 2, date_synced = '$date', updated_at = '$date' WHERE id = $id";
실패
은 결과, date_synced 및 updated_at이 업데이트되지만 상태가 변경되지 않습니다.상태 필드 만 업데이트하고 간헐적으로 실패하는 쿼리가 있습니다.
테스트 환경에서 문제를 재현하지 못했습니다. 프로덕션 mySQL 데이터베이스 또는 잠금 충돌과 같은 문제가있을 수 있습니까?
자세한 정보가 있습니다. 나는 mysqli를 사용하고있다. 상태를 업데이트하는 다른 쿼리는 mysql을 사용합니다. 그게 문제가 되겠습니까?
나는 InnoDB가 행에 의해 잠겨 있다고 생각했다. 부분 행 업데이트를 허용하지 않습니다.
의견을 언급하는 또 다른 업데이트.
내 코드 흐름은 꽤 선형입니다.
The row is created with state=0.
<flash stuff here> and the row is updated with state=1
A cron job pulls all state=1 and sends an api call
if api call is successful, the row is updated with state=2, result, date_synced, and updated_at
if api call is error, the row is updated with state=3, result, and updated_at
상태 필드는 0 (플래시 후) 또는 1 (API 호출 후)으로 설정되지 않습니다. date _synced와 result가 설정되었지만 (때로는) 상태가 여전히 1이므로 상태 필드에 대한 업데이트가 삭제되는 것과 같습니다.
업데이트 트리거를 추가하고 추가 정보가 있는지 확인합니다.
디버깅을 위해 ID, 세션 ID 및 현재 사용자와 함께 이전 값과 새 값을 저장하는 업데이트 트리거와 로그 테이블을 추가해야합니다. 어쩌면 변경 사항이 통과되었지만 또 다른 문장으로 덮어 씌어졌습니다. –
저는 Rufo 경의 의견이 귀하의 상황에 매우 도움이 될 수 있다고 생각합니다. 일이 일어나는 순서와 여러 개의 쿼리 결과가 나오는 더 복잡한 시나리오를 결정하는 데 도움이되기 때문입니다. 당신이보고있는 그림에서. – DWright
"[..] 또는 같은 종류의 잠금 충돌 [..] 일종의 다른 필드가 업데이트되었으므로 잠금 문제가 없습니다. innodb이 잠글 수있는 가장 작은 것은 행입니다. 나는 하나의 필드를 잠글 수 없다. – scones