2013-09-21 3 views
0

mysql에서 테이블 중 하나의 컬럼을 업데이트하려고한다고 가정 해 보겠습니다. 레코드를 선택하고 값을 변경 한 후 데이터베이스로 다시 업데이트해야합니다. 어떤 경우에는 하나의 SQL 쿼리에서이 2 가지 연산을 수행 할 수 없으며 (mysql 제한 때문에) 하위 쿼리로 중첩 할 수 없다. 프로그램에로드해야한다. (자바라고하자) 값을 변경 한 다음 다시 넣어야한다. 데이터 베이스.동시에 MySQL 업데이트 테이블

예를 들어, 프로그램 A는 열의 값을 가져 와서 값을 1로 늘린 다음 다시 넣기를 원합니다. 동시에 B 프로그램도 똑같은 일을하고 싶어합니다. 프로그램 A가 증가 된 값을 되 돌리기 전에, 프로그램 B는 이미 잘못된 값을 얻습니다 (프로그램 B는 프로그램 A에 의해 증가 된 값을 얻으려고하지만 프로그램 A와 동시에 실행되기 때문에 동일한 값을 검색합니다). 에이).

이제 제 질문은 이런 종류의 문제를 처리하는 좋은 방법은 무엇입니까?

또 다른 질문은, mysql이 단일 스레드 시스템이 아니어야한다고 생각하지만 같은 쿼리 (동일한 테이블, 동일한 열 및 동일한 레코드를 업데이트 함)가 동일한 경우 시간, mysql이 이런 종류의 상황을 처리하는 방법은? 어떤 MySQL이 먼저 스케줄을 잡을 것인가?

또한, 멀티 스레드 지원에서 MySQL이 어떻게 작동하는지 조금이라도 설명 할 수 있습니까? 하나의 연결 하나의 스레드? 따라서 해당 연결에서 생성 된 모든 명령문은 동일한 큐에서 예약됩니다.

답변

1

InnoDB를 사용하는 경우 트랜잭션을 사용하여 세분화 된 상호 배제를 제공 할 수 있습니다.

MyISAM을 사용하는 경우 LOCK TABLE을 사용하면 A가 변경을 완료 할 때까지 B가 테이블에 액세스하지 못하게 할 수 있습니다.

두 명의 클라이언트가 동시에 같은 필드를 업데이트하려고 시도하면 어느 것이 경쟁에서 우승하는지 예측할 수 없습니다. 데이터베이스에는 두 개의 쿼리를 직렬화하기위한 내부 상호 배제가 있지만 특정 순서는 본질적으로 무작위입니다.