불행히도 MyISAM 테이블 (bleagh ...)에 레거시 mysql_ * 함수를 사용하는 응용 프로그램이있어 트랜잭션을 사용할 수 없습니다. 현재 잔액을 얻는 코드를 가지고 있습니다.이 잔액이 맞는지 확인합니다. 그렇다면 양을 빼고 새 잔액을 저장합니다.이전 값을 반환하는 MySQL SELECT
문제는 최근에 두 개의 쿼리가 동일한 시작 밸런스를 가져 와서 수량을 뺀 다음 새 밸런스를 기록하는 경우를 보았습니다. 그들은 둘 다 같은 시작 균형을 잡았으므로 두 업데이트 이후의 끝 균형은 잘못되었습니다.
100 - 10 = 90
100 - 15 = 85
그것이 있어야 은 ...
100 - 10 = 90
90 - 15 = 75
는 이러한 요청은 떨어져 몇 분을 실행, 그래서 나는 불일치 조건을 경주 할 예정이다 믿지 않는다. 필자의 초기지만, MySQL 캐시는 균형을 잡는 동일한 초기 쿼리의 결과를 저장하고 있습니다. 그러나 관련 테이블이 수정되면이 유형의 캐시는 삭제됩니다.
나는 모든 것을 하나의 쿼리에 넣는 것으로 해결할 것이지만 여전히 이것을 파악하고 싶습니다. 그것은 나를 신비화합니다. 테이블이 수정 될 때 캐시가 삭제되면 일어난 일이 없어야합니다. 아무도이 같은 것을 듣지 못했거나 그것이 일어난 이유에 대한 아이디어가 있습니까?
이 문제를 재현하는 코드의 단순화 된 버전을 게시 할 수 있습니까? –
mysql_ *로 트랜잭션을 사용할 수 없습니까? innoDB 테이블을 사용한다면 mysql_query ("START TRANSACTION") 등을 수행하는 것만으로도 충분하다고 생각한다. – bfavaretto
@bfavaretto 불행히도 그들은 MyISAM입니다. – dqhendricks