2012-05-29 4 views
2

몇 가지 시도를 해본 결과 autocommitFalse으로 설정하면 속도가 약간 향상 된 것으로 보입니다.autocommit을 true로 설정하면 일괄 처리 커밋보다 오래 걸립니까?

그러나 코드 끝에서 커밋을 수행하면 데이터베이스 행이 업데이트되지 않을 것이라고 걱정됩니다. 예를 들어 데이터베이스에 대한 몇 가지 업데이트를 수행하고 커밋되지 않은 데이터베이스를 쿼리 한 다음 이전 데이터를 제공합니까? 아니면 먼저해야한다는 것을 알고 있습니까?

또는 완전히 내가 실수로 무엇입니까 commit 실제로 무엇입니까?

참고 : 저는 pyodbc와 MySQL을 사용하고 있습니다. 또한, 사용하는 테이블 InnoDB 있습니다, 그 차이가 있습니까?

답변

1

implicit commit을 트리거하는 몇 가지 상황이 있습니다. 그러나 커밋하지 않는 대부분의 상황에서는 다른 연결에서 데이터를 사용할 수 없다는 것을 의미합니다.

다른 연결이 진행중인 트랜잭션과 충돌하는 작업 (다른 연결이 해당 자원을 잠그는 작업)을 수행하려고 시도하면 마지막 요청은 잠금이 해제 될 때까지 대기해야 함을 의미합니다.

성능 문제에 대해서는 autocommit이 모든 변경 사항을 즉시 처리하도록합니다. 인덱스 테이블과 제약 조건을 업데이트/확인해야 할 때마다 큰 테이블에서 성능이 크게 눈에 띄게됩니다. 일련의 쿼리 후에 만 ​​커밋하는 경우 인덱스/제약 조건은 해당 시간에만 업데이트됩니다.

한편, 빈번히 커밋하지 않으면 서버가 두 데이터 세트 간의 일관성을 유지하려고 너무 많은 작업을 할 수 있습니다. 따라서 절충안이 있습니다.

그리고 예, InnoDB을 사용하면 효과가 있습니다. 예를 들어 MyISAM을 사용 중이라면 트랜잭션이 전혀 발생하지 않으므로 변경 사항은 영구적으로 적용됩니다 (autocommit = True와 유사). MyISAM에서는 delay-key-write option으로 게임을 즐길 수 있습니다.

트랜잭션에 대한 자세한 내용은 official documentation을 참조하십시오. 최적화에 대한 추가 팁은 this article을 참조하십시오.

0

동일한 연결을 사용하는 한 데이터베이스는 데이터에 대한 일관된보기를 표시해야합니다. 이번 거래에서 모든 변경 사항이 지금까지 이루어졌습니다.

일단 커밋하면 변경 내용이 디스크에 쓰여지고 다른 (새) 트랜잭션 및 연결에 표시됩니다.

1

InnoDB의 기본 트랜잭션 모드는 REPEATABLE READ이고, 모든 읽기는 트랜잭션 내에서 일관성이있다. 동일한 트랜잭션에서 행을 삽입하고 쿼리하면 새로 삽입 된 행은 보이지 않지만 트랜잭션을 커밋 할 때 저장됩니다.
트랜잭션을 커밋하기 전에 새로 삽입 된 행을 보려면 격리 수준을 READ COMMITTED로 설정할 수 있습니다.

관련 문제