>  기사  >  백엔드 개발  >  MySQL 및 GORM 동시 쓰기로 인해 오류 발생

MySQL 및 GORM 동시 쓰기로 인해 오류 발생

WBOY
WBOY앞으로
2024-02-09 10:30:18487검색

MySQL 및 GORM 동시 쓰기로 인해 오류 발생

MySQL과 GORM 간의 동시 쓰기 문제는 항상 개발자들에게 골칫거리였습니다. 동시성이 높은 상황에서는 여러 스레드가 데이터베이스에 동시에 쓰는 경우 데이터 불일치 또는 잘못된 결과가 발생할 수 있습니다. PHP 편집자 Baicao는 동시 쓰기로 인해 발생하는 문제를 피할 수 있도록 이 문제의 원인과 해결 방법을 분석합니다. 합리적인 설계와 최적화를 통해 MySQL과 GORM의 동시 쓰기 문제를 효과적으로 해결하여 데이터 일관성과 정확성을 보장할 수 있습니다.

질문 내용

golang에서 복잡한 csv 가져오기 스크립트를 구현했습니다. 작업자 풀 구현을 사용합니다. 이 작업자 풀에서 작업자는 제품을 분류하고, 라벨을 지정하고, 브랜드를 지정하는 1,000개의 작은 csv 파일을 실행합니다. 그들은 모두 동일한 데이터베이스 테이블에 씁니다. 여태까지는 그런대로 잘됐다.

제가 직면한 문제는 작업자를 2명 이상 선택하면 프로세스가 무작위로 다음 메시지와 함께 충돌한다는 것입니다

워크플로는

으아악

save() 호출을 트랜잭션으로 래핑하려고 시도했지만 도움이 되지 않았습니다.

이제 다음과 같은 질문이 있습니다.

  1. mysql은 동시에 1개의 테이블에 저장하기에 적합한가요?
  2. 이 작업을 수행하기 위해 트랜잭션이 필요한 경우 어디에 설정해야 합니까?
  3. go SQL 드라이버(항상 packet.go:1102에서 오류가 발생함)가 이 작업에 적합합니까?
  4. 나를 도와줄 사람이 있나요(몇 시간 정도 고용할 수도 있음)?

완전히 막혔어요. 도움이 된다면 소스 코드도 공유할 수 있습니다. 하지만 먼저 이것이 내 코드인지 아니면 일반적인 문제인지 알고 싶습니다.

해결 방법

각 고루틴(또는 스레드를 사용하는 언어의 경우 스레드)에서 새 데이터베이스 연결을 엽니다.

MySQL의 프로토콜은 상태 저장입니다. 즉, 여러 고루틴이 동일한 연결을 사용하려고 하면 요청과 응답이 매우 혼란스러울 수 있습니다.

고루틴 간에 다른 유형의 상태 저장 프로토콜 연결을 공유하려고 할 때도 동일한 문제가 발생합니다.

예를 들어 FTP도 상태 저장 프로토콜이므로 이해하기 더 쉬울 수 있습니다. 클라이언트 고루틴은 "Get file x"와 같은 메시지를 보낼 수 있으며 응답은 파일의 내용을 포함하는 일련의 메시지여야 합니다. 요청/응답이 진행되는 동안 다른 고루틴이 동일한 연결을 사용하려고 하면 두 클라이언트 모두 혼란스러워집니다. 두 번째 고루틴은 요청하지 않은 파일에 속한 패킷을 읽습니다. 파일을 요청하는 첫 번째 고루틴은 예상한 패킷 중 일부가 읽혀졌음을 발견합니다.

마찬가지로 MySQL의 프로토콜은 단일 연결을 공유하는 여러 클라이언트 고루틴을 지원하지 않습니다.

위 내용은 MySQL 및 GORM 동시 쓰기로 인해 오류 발생의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제