Program Tip

JDBC에서 트랜잭션을 시작하는 방법은 무엇입니까?

programtip 2020. 12. 15. 19:46
반응형

JDBC에서 트랜잭션을 시작하는 방법은 무엇입니까?


Connection.setTransactionIsolation(int) 경고 :

참고 : 트랜잭션 중에이 메서드가 호출되면 결과는 구현에 따라 정의됩니다.

이것은 JDBC에서 트랜잭션을 어떻게 시작합니까? 거래를 종료하는 방법은 분명하지만 시작하는 방법은 명확하지 않습니다.

Connection트랜잭션 내부에서 시작 하는 경우 Connection.setTransactionIsolation(int)구현 특정 동작을 피하기 위해 트랜잭션 외부 에서 어떻게 호출해야 합니까?


내 질문에 답하기 :

  • JDBC 연결은 자동 커밋 모드가 활성화 된 상태에서 시작됩니다. 여기서 각 SQL 문은 암시 적으로 트랜잭션으로 구분됩니다.
  • 트랜잭션 당 여러 문을 실행하려는 사용자는 자동 커밋을 꺼야 합니다.
  • 자동 커밋 모드를 변경하면 현재 트랜잭션 (활성 상태 인 경우)의 커밋이 트리거됩니다.
  • Connection.setTransactionIsolation () 은 자동 커밋이 활성화 된 경우 언제든지 호출 될 수 있습니다.
  • 자동 커밋이 비활성화 된 경우 Connection.setTransactionIsolation () 은 트랜잭션 전후에만 호출 될 수 있습니다. 트랜잭션 중간에 호출하면 정의되지 않은 동작이 발생합니다.

출처 :


JDBC 는 트랜잭션과의 연결에서 수행하는 쿼리 / 업데이트를 암시 적으로 구분 합니다. setAutoCommit (false)호출 하여 자동 커밋 모드를 끄고 commit () / rollback ()호출하여 트랜잭션의 끝을 표시 함으로써이 동작을 사용자 정의 할 수 있습니다 . 의사 코드

try
{
  con.setAutoCommit(false);

   //1 or more queries or updates

   con.commit();
}
catch(Exception e)
{
   con.rollback();
}
finally
{
   con.close();
}

이제 보여준 방법에 유형이 있습니다. setTransactionIsolation (int level) 이어야하며 트랜잭션 경계를위한 API가 아닙니다. 한 작업에 의해 변경된 사항이 다른 동시 작업에 표시되는 방법 /시기를 관리합니다 . ACID"I" (http://en.wikipedia.org/wiki/Isolation_(database_systems))


내가 읽고 제안 이를 볼 수 있습니다

따라서 setAutoCommit (false)의 첫 번째 호출과 commit ()의 각 호출은 암시 적으로 트랜잭션의 시작을 표시합니다. 트랜잭션은 다음을 호출하여 커밋되기 전에 취소 할 수 있습니다.

편집하다:

JDBC 트랜잭션에 대한 공식 문서를 확인하십시오.

연결이 생성되면 자동 커밋 모드가됩니다. 즉, 각 개별 SQL 문은 트랜잭션으로 처리되고 실행 직후 자동으로 커밋됩니다. (정확하게 말하면 기본값은 SQL 문이 실행될 때가 아니라 완료 될 때 커밋되는 것입니다. 명령문은 모든 결과 집합과 업데이트 개수가 검색되면 완료됩니다. 그러나 거의 모든 경우에 , 명령문이 완료되어 실행 된 직후 커밋됩니다.)

두 개 이상의 문을 트랜잭션으로 그룹화하는 방법은 자동 커밋 모드를 비활성화하는 것입니다. 이것은 다음 코드에서 설명됩니다. 여기서 con은 활성 연결입니다.

con.setAutoCommit (false);

출처 : JDBC 트랜잭션


사실, JDBC 튜토리얼의이 페이지 가 더 읽기 좋을 것입니다.
연결을 얻고 격리 수준을 설정 한 다음 업데이트와 작업을 수행 한 다음 커밋 또는 롤백합니다.


처음에는 연결을 "setAutoCommit (true)"모드로두고 싶지만 여전히 트랜잭션이 필요한 경우 수동으로 트랜잭션을 실행할 수 있습니다.

 try (Statement statement = conn.createStatement()) {
      statement.execute("BEGIN");
      try {
        // use statement ...
        statement.execute("COMMIT");
      }
      catch (SQLException failure) {
        statement.execute("ROLLBACK");
      }
  }

트랜잭션에 다음 방법을 사용할 수 있습니다.

  1. 다음과 같은 연결 개체를 만들어야합니다. con
  2. con.setAutoCommit(false);
  3. 당신의 쿼리
  4. 모두 사실이라면 con.commit();
  5. 그밖에 con.rollback();

Maybe this will answer your question: You can only have one transaction per connection. If autocommit is on (default), every select, update, delete will automatically start and commit (or rollback) a transaction. If you set autocommit off, you start a "new" transaction (means commit or rollback won't happen automatically). After some statements, you can call commit or rollback, which finishes current transaction and automatically starts a new one. You cannot have two transactions actively open on one JDBC connection on pure JDBC.

ReferenceURL : https://stackoverflow.com/questions/4940648/how-to-start-a-transaction-in-jdbc

반응형