2011-08-28 2 views
2

저는 DB 프로그래밍을 처음 사용합니다. 나는 도로를 가로 질러 문제가 발생하면 내 행동을 롤백하는 데 trasaction을 사용할 수있는 모든 곳을 읽었다.MYSQL 변환 사용, 기본 질문

나는 거래에 대해 알고 싶습니다

  1. 가 DB를 거래 "잠금"는 무엇입니까?
  2. 잠금이 발생하면 db에 액세스하는 다른 사용자는 어떻게됩니까? 오류 메시지가 나타날 수 있습니까? 프로그래밍 방식으로 이러한 오류를 확인하고 다시 시도해야합니까?

데이터베이스를 트랜잭션으로 사용할 준비가 되셨습니까? autocommit을 off로 설정하는 것과 같은가? 다른게 있니? 거래를 사용할 때 단점이 있습니까? 그것은 나에게 모두 좋은 것처럼 보인다.

미리 감사드립니다.

답변

2

전체 데이터베이스가 잠겨 있지 않은 경우 매우 비효율적입니다. 대신 MySQL (저장소 엔진에 따라 다름)은 레코드를 잠그고 어떤 경우 전체 테이블을 잠급니다.

저장소 엔진이 InnoDB인지 확인해야합니다. 그렇지 않으면 트랜잭션을 사용할 수 없습니다. 자동 커밋은 연결 클라이언트에만있는 기능이며 DB를 변경할 때마다 커밋을 실행합니다.

트랜잭션으로 인해 오버 헤드가 발생하고 심각한 성능 문제가 발생할 수 있습니다. 트랜잭션으로 동일한 레코드에 쓰려고하면 (홈페이지의 히트 카운터를 반복해서 말하면)이 레코드를 잠그고 많은 쓰기가 차단됩니다.

데이터베이스에 일관성을 제공해야 할 경우 트랜잭션을 사용해야합니다. 즉 일련의 레코드를 함께 기록하거나 1 회 기록해야합니다.

1
  1. 간단한 대답은 예입니다.
  2. 대기중인 쿼리는 테이블이 잠길 때까지 기다린 다음 실행합니다.

기본적으로 MyISAM 인 사용중인 db 엔진에 따라 잠금이 테이블 식임을 알아야합니다. Row-Locking을 수행하는 InnoDB 같은 여러 엔진이 있습니다.

또한 서로 다른 테이블에 모두 있어도 동시에 실행할 수있는 많은 쿼리가 있습니다. 이 숫자를 초과하면 잠금 장치도 제공됩니다. phpmyadmin에서받은 잠금 수를보고 db 처리에 문제가 있는지 확인할 수 있습니다.

거래 관련 : 때로는 정보의 일부로 DB를 업데이트하려고합니다. 그것은 당신의 사용법에 달려 있습니다.

+0

MyISAM은 트랜잭션을 지원하지 않으며, 테이블 수준과 행 수준의 잠금은 트랜잭션 잠금과 정확히 일치하지 않으며 저장소 엔진에 구현 된 잠금 기능입니다. –

1

Ans 1. 아니요. 쿼리의 특성에 따라 테이블의 일부 또는 테이블 완성을 잠급니다. 이러한 locak는 읽기 또는 쓰기 잠금이 될 수 있습니다. Ans 2. 사용자가 다른 사용자가 쓰기 잠금을 가지고있는 테이블의 일부를 잠 그려면 잠금이 해제 될 때까지 사용자는 계속 기다립니다. 다른 사용자가 읽기 잠금을 가지고 있고 사용자가 쓰기 잠금을 원할 경우 사용자는 잠금이 해제 될 때까지 기다리게됩니다. 교착 상태에 대해 읽어야합니다.

희망이 있습니다.

2
  1. 아뇨 allow queries to lock specific portions of the database, 데이터베이스 엔진에도 업데이트되는 테이블에 다른 클라이언트의 데이터를 일정한 뷰를 제공 할 수있다.

  2. 관련 검색어가 발생하기 전의 데이터를보고 테이블에 쓰지 못할 수 있습니다.

모든 테이블 엔진 지원 거래 당신이하는 일 (예 : 이노)을 사용할 필요가 있으므로, 및 트랜잭션 처리 시간의 비 - 제로 시간이 걸릴 않습니다.

+0

실제로 볼 수있는 것은 격리 수준에 따라 다르지만 단순화로 대답은 완전히 정확합니다. +1 –

1

우리는 MySQL과 트랜잭션에 대해 이야기하고 있기 때문에, 대부분의 트랜잭션은 InnoDB에 관한 것이지만, 대부분의 트랜잭션은 저장소 엔진에 유효합니다.

트랜잭션 잠금은 스토리지 엔진과 transaction isolation level에 따라 다릅니다. MySQL/InnoDB는 트랜잭션을 구현하기 위해 행 버전 관리를 사용하고 직렬화를 제외한 모든 격리 수준에서 사용되는 잠금 수를 줄입니다. MySQL의 기본 격리 수준은 반복 읽기입니다.

일반적으로 업데이트는 쓰기 잠금을 사용합니다. 즉, 다른 트랜잭션이 동일한 행을 업데이트 할 수는 없지만 읽을 수는 있습니다. 잠긴 행에 액세스하려고하면 MySQL은 잠금 대기 시간 초과에 도달 할 때까지 기다린 다음 쿼리를 중단하고 잠금 대기 시간 초과에 도달했음을 알립니다. 보통 이런 일은 없어야합니다. , dead-locks을 소개하지만 트랜잭션을 사용에서 가장 위험 부분 - transaction A 업데이트 record1transaction B 의해 잠겨 record2 업데이트하려고 할 때 - record2를 업데이트 한 transaction Brecord1를 업데이트하려고하지만, record1A 의해 잠겨, 그래서 모두 대기에 대한 서로.

일반적인 조언은 트랜잭션을 가능한 작게 유지하고 교착 상태를 방지하기 위해 가능한 한 빨리 업데이트 할 행을 잠그는 것입니다 (이 경우 업데이트를 위해 선택 ...을 사용할 수 있음).

많은 정보는 MySQL documentation과 MySQL 인증 가이드에서 찾을 수 있습니다.