트랜잭션 처리의 일관성은 MySQL을 업데이트하고 데이터를 선택 설명

MySQL은 트랜잭션, 기본이 자동으로 제출되는 자동 커밋 = 1;

예를 들어 :하지만, 어떤 경우에는 문제가 될 것입니다 :

당신이 한 번 1000 데이터를 삽입 할 경우, MySQL은, 시간을 commit1000합니다

우리가 폐쇄 자동 커밋 경우 [자동 커밋 = 0], 프로그램에 의해 제어만큼 먼저 순서 때문에 또한, 커밋으로 더 나은 업무의 특성을 반영하기 위해!

같은 양, 숫자 등의 값을, 운영의 필요성!

하나의 원리를 기억 잠금이 세 갱신 선고

MySQL의의 이노에서, 미리 설정된 Tansaction 격리 수준이 REPEATABLE READ입니다 (다시 읽을 수 있습니다)

읽기 SELECT 잠금은 두 가지 방법은 다음과 같습니다
않으면 • MODE SELECT ... LOCK 공유하세요 
• ...를 선택에 대한 업데이트를

트랜잭션 (거래)의 두 가지가 동일한 데이터 테이블에 SELECT 중이었다 경우에만 수행 한 후에는 제출 된 다른 트랜잭션 데이터 (커밋) 기다려야합니다.

가장 큰 차이점은 SHARE 모드에서 LOCK 양식과 거래 한 당사자가 교착 상태가 발생할 가능성이 업데이트 될 때이다.

후자의 SELECT가 같은 양식을 업데이트하면 간단히 말해서, 그것은 SELECT ... UPDATE를 사용하는 것이 가장 좋습니다.

예를 들면 :

당신이 제품의 제품의 형태로 저장 물품의 수량의 수를 가정 먼저 주문이 설립되기 전에 충분한 양의 수량 (수량> 0), 다음 만 다음 숫자 1로 업데이트 여부를 결정해야합니다. 다음과 같이 코드입니다 :

제품의 수량 SELECT WHERE ID = 3; UPDATE 제품 SET 수량 = 1 WHERE ID = 3;

왜 안전하지?

아마도 소량의 조건에는 문제가 없지만, 데이터 액세스의 많은 수는 "확실히"잘못. 우리는 프로그램의 첫 번째 줄, 수량이 2 판독 선택이 수치는 잘못하지 보이지만, MySQL은 시간을 업데이트 준비 할 때, 어떤 사람들은 재고 버클이있을 수 있다고 가정, 수량> 0 재고 버클해야하는 경우 0하지만, 프로그램이 몰랐던, 그것은 UPDATE의 이동의 잘못입니다. 따라서, 트랜잭션이 읽기와 제출 된 데이터의 정확성을 유지하기 위해 메커니즘을 통해 통과해야합니다.

그래서 우리는 MySQL의에서이 문제를 테스트 할 수 있습니다 다음과 같이 코드입니다 :

SET의 AUTOCOMMIT = 0; WORK를 BEGIN; 제품의 수량 SELECT FOR UPDATE WHERE ID = 3;

ID = 3 데이터가 잠겨있는이 제품 데이터에서 트랜잭션이 그 양을 보장 할 수 있도록 UPDATE에 대한 ID = 3이 다른 문제에 읽을 제품의 SELECT *를 저지른 후, 다른 트랜잭션을 수행하기 위해 기다려야합니다 (주 3) 숫자는 정확합니다.

UPDATE 제품 수량 = SET '1'WHERE ID = 3; WORK를 COMMIT;

데이터베이스에 제출 (커밋)이 제품은 잠금 해제.
• 주 1 : 트랜잭션의 시작과 끝 지점에 대한 BEGIN / COMMIT, MySQL의 명령 창을 사용할 수있다 두 개 이상의 잠금 상태의 상호 작용을 관찰합니다.
• 주 2 : 트랜잭션에서 데이터 만 같은 합계 동안 실행 다른 트랜잭션이 끝날 때까지 대기 SHARE 모드 IN UPDATE 또는 LOCK SELECT ... FOR, 일반적으로 영향에 의해 영향을받지 ...을 선택합니다.
• 주 3 : 이노 기본 행 수준 잠금이기 때문에, 잠금 데이터가이 열을 참조 할 수있다.
• 주 4 : InnoDB하지만 LOCK 테이블을 사용 당신은 최후의 수단을 사용하려는 경우 InnoDB의 형태는, LOCK 테이블 명령을 사용하지 마십시오, 공식 설명을 참조하시기 바랍니다, 시스템 교착 상태가 자주 발생하지 마십시오.

UPDATE 的 행 잠금 与 테이블 잠금을위한 MySQL은 SELECT ...

UPDATE 사용에 대한 ... SELECT 위에 소개하지만, 락 (잠금) 데이터 차별주의 깊게 살펴해야 할 것입니다. InnoDB의 기본이 지정된 기본 키 때문에 전용 "명확한"행 수준 잠금이기 때문에, MySQL은, 그렇지 않으면 MySQL은 (표 잠금을 수행 할 전체 데이터 양식을 잠금, 행 잠금 (만 선택한 데이터를 잠금) 수행 ).

예를 들면 :

두 가지 형태의 제품이 가정, 이름을 가진 두 개의 필드 ID가, ID는 기본 키입니다.

실시 예 1 : (명시 기본 키를 지정하고 데이터가 행 잠금)

SELECT * 제품 FROM WHERE 아이디 = UPDATE를위한 '3';

예 2 : (기본 키, 테이블 잠금)

제품 SELECT * FROM WHERE UPDATE에 대한 이름 = '마우스';

예 3 : (기본 키가 명확하지 않다, 테이블 잠금)

SELECT * 제품 FROM WHERE ID <> '3'UPDATE에 대한;

예 4 : (기본 키가 명확하지 않다, 테이블 잠금)

제품 SELECT * FROM WHERE ID LIKE '3'UPDATE에 대한;

낙관적 비관적 잠금 전략

비관적 잠금 : 몇 줄의 잠금이 라인의 몇 가지 다른 업데이트는 데이터를 읽을 때 비관적 잠금이 끝날 때까지 계속해야합니다.

낙관주의가 : 데이터를 읽을 때 현재 업데이트를 취소하는 경우, 업데이트, 데이터가 업데이트되었는지 여부를 확인하기 위해 고정하지 않는 대기 시간 일반 비관적 잠금이 너무 깁니다 우리가 낙관적 잠금을 선택할 것을 받아 들일 수 없다.

추천

출처www.linuxidc.com/Linux/2019-07/159566.htm