2014-07-11 2 views
1

READ COMMITTED보다 높은 것이 자동 커밋 모드에서 유용하다는 이유가 표시되지 않습니다. 자동 커밋은 각 쿼리가 끝날 때마다 트랜잭션을 끝내고, 차례대로 선택한 데이터에 대한 획득 된 잠금을 해제합니다. 잠금이 여러 쿼리에서 생존하지 못하면 일관된 읽기를 수행 할 수 없습니다. 따라서 자동 커밋 모드에서 격리 수준을 높이면 더 많은 데이터가 잠길 수 있습니다.> BAD자동 커밋 모드에서 높은 격리 수준을 사용하는 이유는 무엇입니까?

맞습니까?

+0

쿼리가 동일한 테이블을 두 번 읽고 다른 결과를 얻는다고 생각합니다. –

+0

@MK conn.execute ("SELECT * FROM TABLE; SELECT * FROM TABLE")와 같은 다중 명령문을 의미합니까? – velikolay

+0

@velikolay 내 생각에 MK.의 의견은 'select * from employees e join m. m.id = e.manager'와 같은 자체 조인을 가진 쿼리에 관한 것입니다. – hvd

답변

2

참조하십시오. 이것은 사실이 아닙니다. 이것을 직관적으로 볼 수있는 예를 만들어 봅시다. 다음과 같은 두 가지 거래를 비교 :

--A 
select * from T where ID = 1 
select * from T where ID = 2 

--B 
select * from T where ID IN (1, 2) 

벼락치기 두 (적어도 모든 RDBMS'es 및 스토리지 엔진에) 어떤 동시성 문제를 방지하지 않습니다 하나의 문으로 읽습니다. 두 트랜잭션은 SQL Server에서 동일한 잠금 및 일관성 속성을 예로들 수 있습니다. 일부 다른 RDBMS는 각 명령문에 대해 MVCC를 사용합니다. MVCC는 직렬화 기능을 제공하지 않습니다. serializability 하에서 만 동시성 문제가 항상 안전합니다.

하나 또는 두 개의 문장을 사용하는지 여부는 아무런 차이가 없습니다. 자동 커밋 또는 동일하지 않음.

이 아닌 READ COMMITTED에서 직렬화됩니다. 따라서 다음을보십시오 : READ COMMITTED을 사용하지 않고 동시에 자동 커밋해야하는 이유가 있습니다.

+0

설명해 주셔서 감사합니다. 그러나 저는 여전히 이해할 수 없습니다. 제 견해로는 - 반복적 인 읽기를하지 않으면 동시성 문제가 발생하지 않습니다 (다른 데이터 선택). 필자가 가정 하듯이 READ COMMITED 격리를 사용하면 매우 복잡한 쿼리가 끝날 때까지 잠금을 유지할 수 있습니다. – velikolay

+0

@velikolay hm 나는 옵션 A가 아주 위험하다고 생각했다. 다음 순서를 가정 해보십시오. ID 1은 버전 1로 읽습니다. 두 행은 버전 2로 업데이트됩니다. ID 2가 읽혀집니다. 판독기에는 이제 ID 1의 이전 버전과 ID 2의 새 버전이 있습니다.이 상태는 데이터베이스에 절대로 존재하지 않습니다. 그것은 직렬화 가능하지 않고 동시성 문제 일 수도 있습니다. – usr

+0

자, 무슨 뜻인지 알았어. 그게 내가 내 이론에서 빠뜨린 것입니다 :) – velikolay

-1

난 당신이 당신이 할 수있는 경우에 COMMITTED READ를 사용한다 등 오라클이나 PostgreSQL을,

네 말이 맞아 같은 다른 브랜드에 비해 다른 구현 세부 정보를 가질 수있는 MySQL의 구현에 관한 응답 할 수 있습니다. MySQL에서는 REPEATABLE READ보다 적은 수의 잠금을 생성하며 자동 커밋 만 사용하는 경우 REPEATABLE READ의 일관된 트랜잭션 읽기 뷰는 필요하지 않습니다.

MySQL에서 REPEATABLE READ는 기본 트랜잭션 격리 수준입니다. 조금 더 많은 오버 헤드가 생기기 때문에 다소 안타깝습니다.

@MK가 가정 할 때 동일한 행을 두 번 읽는 경우 한 문장이 다른 결과를 보는 위험에 노출되지 않습니다. READ COMMITTED에서도 짧은 트랜잭션 읽기보기를 작성하여 각 명령문을 "원자 적"으로 만듭니다. 그러나 동시 업데이트를 차단하지는 않습니다. 그것은 MVCC의 마법입니다!

당신은 하나의 문이 그냥 하나 개의 문장이라는 사실에 의해 동시성 문제에서 항상 안전하다고 생각하는 것 같다 http://www.mysqlperformanceblog.com/2012/08/28/differences-between-read-committed-and-repeatable-read-transaction-isolation-levels/

+0

항상 추천하지 않는 매우 일반적인 추천 및 진술을 작성합니다. – usr

+0

''read committed '*** ***은 디폴트 격리 수준입니다 - 최소한 Postgres와 Oracle에서는 –

+0

나는 위의 내용을 편집하여 MySQL 구현에 대해 설명합니다. OP가 질문 [tag : mysql]에 태그하지 않았으며 다른 브랜드에는 차이가있을 수 있음을 인정합니다. –