2011-01-28 8 views
18

현재 MySQL 데이터베이스를 실행 중입니다. 모든 테이블이 테이블 엔진 InnoDB를 사용하고 있습니다.MySQL의 동시성, 어떻게 작동하며 응용 프로그램에서 처리해야합니까?

내 응용 프로그램에 로그인하는 모든 사람이 레코드를 볼 수 있으며 어느 시점에 두 명의 사용자가 동시에 레코드를 업데이트하거나 삽입 할 수 있다고 걱정됩니다. MySQL은 이러한 유형의 동시성 문제를 우아하게 처리합니까? 아니면이 코드를 프로그래밍해야합니까?

내 코드에이 코드를 프로그래밍해야한다면 어떻게 이와 같은 동시성 사례를 처리해야합니까?

+0

이와 관련해서는 신경 쓸 필요가 없습니다. 현대의 데이터베이스는 동시성 제어에서 충분히 똑똑합니다. :) – Tauquir

+0

thats 내가 생각한 것 내가 더블 체크를하고 싶었습니다. – medium

답변

20

SQL 문은 원 자성입니다.

UPDATE Cars SET Sold = Sold + 1 

아무도이 문 중에 Sold 변수를 변경할 수 있습니다 :이 같은 것을 실행하는 경우 즉,이다. 다른 사용자가 동일한 명령문을 동시에 실행하는 경우에도 항상 1 씩 증가합니다. 당신이 서로에 따라 문이있는 경우

문제가 발생합니다 : 이러한 쿼리 사이

a = SELECT Sold FROM Cars; 
UPDATE Cars SET Sold = a + 1; 

를 다른 사용자가 판매 테이블 자동차 및 업데이트를 변경할 수 있습니다. 이를 막으려면 트랜잭션으로 포장하십시오.

BEGIN; 
a = SELECT Sold FROM Cars; 
UPDATE Cars SET Sold = a + 1; 
COMMIT; 

트랜잭션은 MyISAM이 아닌 InnoDB에서 지원합니다.

+2

그 설명에 감사드립니다. – medium

+2

거래에서도 보증은 없습니다. 기본적으로 MySQL은 트랜잭션에서도 쓰기 작업에 대해서만 행 수준 잠금/테이블 잠금을 수행합니다. ** a **에 올바른 값을 지정하려면 SELECT에 * FOR UPDATE *를 넣거나 TRANSACTION에 * SERIALIZABLE *으로 높은 * 분리 수준을 지정해야합니다. ** 자세한 정보 : ** [내부 잠금] (https://dev.mysql.com/doc/refman/5.6/en/internal-locking.html), [격리 수준] (https : //dev.mysql .com/doc/refman/5.6/ko/innodb-transaction-isolation-levels.html), [잠금 읽기] (https://dev.mysql.com/doc/refman/5.6/en/innodb-locking- reads.html) –

관련 문제