2012-11-07 5 views
4

좀 자바 코드는 MySQL 데이터베이스에 연결하기 위해 JDBC를 사용하여있어, 다음 코드는 모두 같은 연결을 사용하여, 다음 하나의 업데이 트를 일부 읽기 작업을 수행합니다. 예외가있는 경우 connection.rollback()이 호출됩니다. 예외가 없으면 connection.commit()이 호출됩니다. 이 단계에서는 테스트를 실행할 때마다 연결이 새로 생성됩니다 (즉, 풀에서 생성되지는 않음). 내 코드는 하나의 연결 만 생성하며 테스트를 통해 사용됩니다.MySQL의 JDBC는 실패 롤백

사용되는 접속은 접속 인스턴스가 생성 된 직후라고 connection.setAutoCommit(false) 갖는다. 이 예외이며 connection.rollback()가 호출 될 때 어떤 이유

는, 내 업데이트가 최선을 다하고보다는 롤백 된 것으로 밝혀졌습니다.

디버깅을 통해, 내가

  • connection.setAutoCommit(false)를 호출 한 후, 다음을 확인했다, connection.getAutoCommit() 예상대로 false의 값을 반환합니다. 또한 "Select @@session.autocommit"은 자동 커밋이 예상대로 해제되었음을 나타내는 0의 값을 반환합니다. connection.rollback()를 호출하는

  • 직전에, 같은 검사가 자동 예상대로 꺼져 커밋을 보여준다.

  • connection.commit()은 분명히 호출되지 않고 connection.rollback()이 분명히 호출되고 있습니다.

는 또한 명시 적으로 문 "rollback;"를 실행 시도했지만 내 문제가 해결되지 않습니다. 또한 연결을 생성 한 후 명시 적으로 문을 실행하는 시도했습니다 "Set AUTOCOMMIT = 0;".

모든 테이블은 InnoDB의 스토리지 엔진을 사용합니다. SQL Workbench를 통해 자동 커밋, 롤백 및 커밋이 예상대로 작동합니다.

나는 MySQL의 버전 '5.0.91 - 커뮤니티 - NT'를 사용하고 있습니다. MySQL jdbc 드라이버 버전은 5.1.19입니다. 내 업데이트가 호출되지 커밋 꺼져 자동 위탁하더라도 최선을 다하고지고, 롤백이 명시 적으로 호출되는 이유에 어떤 제안을 누구나 가지고 있습니다

자바 5를 사용하고 있는데?

건배.

+2

시도한 코드를 게시하십시오. – sunleo

+0

코드를주세요 !!!!! – Konza

답변

2

내가 OP에서 참조 코드는 하나의 블록에없는, 그것은 클래스에 걸쳐 분산된다. 위 코드에 대한 예제를 만족시키기 위해이 문제를 비추기위한 단일 코드 블록을 준비했습니다. 코드 블록이 완료되면 문제를 재현 할 수 있는지 테스트했습니다. 글쎄, 난 문제를 복제 할 수 없습니다 - 롤백 잘 했어. 이로 인해 필자는 제작 코드를 통해 내가 작성한 코드 블록을 넘어서는 모든 일을 해결할 수있었습니다.

이 생산 코드를 모두 작성하고 임시 테이블을 삭제 것으로 나타났다. 가장 관련성이 높은 업데이트를 수행 한 후 임시 테이블을 삭제하고 예외가 있는지 여부에 관계없이 임시 테이블을 삭제합니다. MySQL에서 테이블을 삭제하면 암시 적 커밋 호출이 발생합니다. 따라서 내 코드에서 예외를 던지고 connection.rollback()을 호출하는 코드 사이에서 내재 된 호출이 커밋되도록하는 테이블을 삭제합니다. 그러므로 내 '자동 커밋'문제.

+0

이것을 확인하십시오 (http://stackoverflow.com/questions/730621/do-ddl-statements-always-give-you-an-implicit-commit-or-can-youget-an-implicit). 모든 DDL 명령은 커밋을 수행합니다. – richardtz

+0

예, 모든 DDL이 커밋을 유발하지는 않습니다. 예를 들어 위에서 언급 한 임시 테이블을 만들면 암시 적 커밋이 발생하지 않습니다. 서로 다른 공급 업체가 서로 다르게 작업하는지 확신 할 수 없지만 MySQL에서 암시 적 커밋을 야기하는 DDL 작업의 최종 목록을 발견했습니다. 건배. – user1806029

+0

@richardtz 그 질문은 오라클에 대한 것입니다. DDL의 실제 커밋 동작은 데이터베이스에 따라 다릅니다 (['DatabaseMetaData.dataDefinitionCausesTransactionCommit()'] (http://docs.oracle.com/javase/7/docs/api/java/sql/DatabaseMetaData) 이유 중 하나입니다. html # dataDefinitionCausesTransactionCommit()). –