문제

나는 데이터베이스에서 여러 스레드로 작업하는 데 처음부터 처음부터 시작됩니다 (대부분의 경력은 프론트 엔드에 소비되었습니다).

오늘 저는 테이블 잠금을 사용하여 트랜잭션을 모방하는 ISAM 테이블을 사용하여 MySQL DB에 값을 저장하기 위해 작성한 간단한 PHP 앱을 테스트하려고했습니다.

방금 절차에 대한 블로그 게시물을 썼습니다.

JMeter로 테스트

내 결과에서 내 간단한 PHP 앱은 트랜잭션 무결성을 그대로 유지하는 것으로 보입니다 (CSV 파일의 데이터에서 볼 수 있듯이 데이터베이스에서 다시 추출한 데이터와 동일) :

CSV 파일 :

alt csv for al alt csv for bl

JMeter Test 실행 후 두 사용자를위한 데이터 쿼리 :

alt alt

트랜잭션 데이터 무결성이 손상되지 않았다는 가정에 옳습니까?

동시성을 어떻게 테스트합니까?

도움이 되었습니까?

해결책

수동 테이블 잠금 장치없이 innodb를 사용하고 동일한 효과를 얻지 않겠습니까?

또한, 당신은 무엇을 보호하고 있습니까? 두 사용자 (Bill and Steve)를 고려하십시오.

  1. Bill Loads Record 1234
  2. Steve는 레코드 1234를로드합니다
  3. Steve는 레코드 1234를 변경하고 제출합니다
  4. Bill은 약간 기다린 다음 오래된 레코드 1234를 업데이트하고 제출합니다. 이러한 변화는 Bill의 Clobber입니다.

테이블 잠금은 기본 MyISAM 테이블 잠금보다 더 높은 데이터 무결성을 제공하지 않습니다. MyISAM은 데이터 손상을 중지하는 데 필요한 경우 기본적으로 테이블 파일을 잠그게합니다.

실제로, MyISAM을 통해 InnoDB를 사용하는 이유는 테이블 잠금 대신 행 잠금을 수행하기 때문입니다. 또한 거래를 지원합니다. 다른 레코드에 대한 여러 업데이트는 서로를 차단하지 않으며 거래가 완료 될 때까지 여러 레코드에 대한 복잡한 업데이트가 차단됩니다.

동일한 레코드에 대한 두 개의 업데이트가 응용 프로그램을 위해 동시에 발생할 가능성을 고려해야합니다. 가능하면 테이블/행 잠금이 두 번째 업데이트를 차단하지 않으며 첫 번째 업데이트가 완료 될 때까지 연기합니다.

편집하다

내가 기억 한 바에 따르면, Myisam은 인서트에 대한 특별한 행동을 가지고 있습니다. 테이블의 끝에 추가되므로 인서트를 위해 테이블을 전혀 잠글 필요가 없습니다. 고유 한 인덱스 또는 비 자석 분쟁 기본 키가있는 테이블에는 해당되지 않을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top