is setautocommit(true)은 conn.commit(conn.commit) 다음에 필요합니다.
db 연결을 받았습니다.conn) 수영장에서.
라고 가정합니다.autocommit해당 연결에서는 참입니다.
지금이다conn.setautocommit(false)설정됨;
그리고 몇 번의 명세서 업데이트 후에 그리고 마지막으로.conn.commit()/conn.rollback()다 했습니다.
이제 코드를 명시적으로 작성해야 합니다.setautocommit(true)이전 연결 상태로 되돌리시겠습니까?
ORcommit()\rollback()설정할 것setautocommit(true)본질적으로?
그것은 당신이 그 연결을 어디서 얻었는지에 달려 있습니다.직접 연결을 만든 경우 자동 커밋 상태를 복원할 필요가 없습니다.
데이터 원본에서 가져온 경우 데이터 원본이 풀에 연결을 유지하고 다음 코드 조각이 설정한 것을 예상하지 못할 수 있으므로 상태를 원래 상태로 복원해야 합니다.
commit()자동 커밋의 값에는 영향을 주지 않습니다.자동 커밋을 활성화하면 JDBC 운전자가 전화를 걸 수 있습니다.commit()사용자가 실행하는 각 명령문 뒤에 표시됩니다.아직 전화할 수 있습니다.commit()당신이 원할 때마다, 그것은 아무 효과도 없을 것입니다 (그 외에는).rollback()항상 당신이 원하는 것을 하지는 않을 것입니다).
[EDIT] 자동 커밋이 처리되는 방법은 연결 풀에 따라 다릅니다. dbcp에는 연결을 제공하기 전에 자동 커밋을 해제하는 구성 옵션이 있으며, 사용자가 풀로 돌아갈 때 c3p0이 연결을 롤백합니다.연결 풀의 작동 방식에 대한 설명서를 읽습니다.
어떤 풀이 사용되는지 모르는 경우 자동 커밋을 다음으로 설정하는 것이 안전한 솔루션입니다.false연결이 설정될 때마다 연결을 롤백하고 예외가 발생할 경우 연결을 롤백합니다.포장지를 작성할 것을 제안합니다.
public <T> T withTransaction( TxCallback<T> closure ) throws Exception {
Connection conn = getConnection();
try {
boolean autoCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
T result = closure.call(conn); // Business code
conn.commit();
conn.setAutoCommit(autoCommit);
} catch( Exception e ) {
conn.rollback();
} finally {
conn.close();
}
}
이 코드는 연결을 올바르게 처리하므로 비즈니스 코드에서 더 이상 걱정할 필요가 없습니다.
재미있게,conn.setAutoCommit(true);을 의미합니다.commit(있는 경우)autoCommit(false)모드, 여기를 보세요, 하지만 여전히 그들을 제거하는 것이 사람들에게 더 분명할 수 있습니다.
Oracle 12c에서는 연결이 기본적으로 autocommit true로 설정됩니다.그러나 자동 커밋을 false로 설정한 경우 연결 풀.conn.setAutoCommit(autoCommit)로 릴리스하기 전에 자동 커밋을 true로 재설정해야 합니다. 마지막 블록으로 이동해야 합니다.
언급URL : https://stackoverflow.com/questions/12402347/is-setautocommittrue-needed-after-conn-commit
'programing' 카테고리의 다른 글
| Firebase 호스팅:SPA의 index.html에 대한 캐싱을 방지하는 방법 (0) | 2023.07.20 |
|---|---|
| 다른 폴더의 git "log" 사용 (0) | 2023.07.20 |
| Python에서 현재 모듈의 속성에 대한 참조를 얻는 방법 (0) | 2023.07.20 |
| Oracle SQL Developer에서 관계를 볼 수 있는 방법이 있습니까? (0) | 2023.07.20 |
| 모든 사용자 테이블을 잘라내는 방법은 무엇입니까? (0) | 2023.07.20 |