복붙노트

[SPRING] Spring + JDBC에서 autocommit을 끄려면 어떻게해야합니까?

SPRING

Spring + JDBC에서 autocommit을 끄려면 어떻게해야합니까?

JDBC와 함께 Spring을 사용하고 있으며 자동 커밋이라는 것을 알았습니다.

spring-servlet.xml에서 어떻게 해제 할 수 있습니까?

이것은 현재 구성입니다.

<bean id="dataSource"
    class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
    p:driverClassName="${jdbc.driverClassName}"
    p:url="${jdbc.databaseurl}" p:username="${jdbc.username}"
    p:password="${jdbc.password}" />

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
</bean>

해결법

  1. ==============================

    1.내 구성이이 행을 놓친 것 같습니다.

    내 구성이이 행을 놓친 것 같습니다.

    <tx:annotation-driven transaction-manager="txManager"/>
    

    그런 다음 서비스 클래스에서 @Transactional 주석을 사용합니다. 예를 들어

    @Service
    class CompanyServiceImpl implements CompanyService{
        @Autowired
        private CompanyDAO companyDAO;
    
        @Transactional
        public void addCompany(Company company) {
                companyDAO.addCompany(company); // in here, there is JDBC sql insert
                companyDAO.addCompany_fail(company); // just for test
        }
    }
    

    addCompany_fail ()에서 예외가 발생하면 첫 번째 addCompany ()도 롤백됩니다.

    나는 Spring에서 트랜잭션이 어떻게 제어되는지를 이해하기 위해이 문서를 따라 갔다. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html

    Spring에서 JDBC로 코딩하는 법을 이해하기 위해이 문서를 따라 갔다. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html

    나는 또한이 (무료) http://www.infoq.com/news/2009/04/java-transaction-models-strategy를 읽었다. 정말 좋은 것입니다. 그리고 나는 작가와 마찬가지로 대부분의 사람들이 거래에 대해 이해하지 못한다고 느낍니다.

    추신: 많은 사람들은 Hibernate / Spring 프레임 워크를 사용하는 것이 단지 JDBC와 Transaction Control의 복잡성을 피하기 위해서라는 것을 오해하고있는 것으로 보인다. 많은 사람들은 "JDBC와 트랜잭션이 너무 복잡해서 Hibernate를 사용하고 그 두 가지를 잊어 버리는 것"이라고 생각합니다. Spring + Hibernate 또는 Spring + JDBC에 관한 인터넷상의 많은 예제들은 트랜잭션에 전혀 관심이 없다. 나는 이것이 나쁜 농담이라고 생각한다. 거래는 진정한 이해 없이는 처리 할 수 ​​없기에 너무 심각합니다.

    Hibernate와 Spring은 매우 강력하고 복잡합니다. 그런 다음 누군가가 말했듯이, "큰 힘은 책임감과 함께 온다".

    업데이트 : 2013-08-17 : 거래에 대한 좋은 예가 http://www.byteslounge.com/tutorials/spring-transaction-propagation-tutorial입니다. 그러나 이것이 REQUIRES_NEW를 사용하고자한다면 왜 다른 클래스를 생성해야하는지 설명하지 않습니다 (그렇지 않으면 Spring Transaction propagation REQUIRES_NEW, REQUIRES_NEW는 실제로 새로운 트랜잭션을 생성하지 않습니다)

    업데이트 : 2018-01-01 : 스프링 부트 1.5.8.RELEASE로 전체 예제를 만들었습니다. https://www.surasint.com/spring-boot-database-transaction-jdbi/ 몇 가지 기본 실험 예제는 https://www.surasint.com/spring-boot-connection-transaction/에서 확인할 수 있습니다.

  2. ==============================

    2.defaultAutoCommit 속성을 사용해보십시오. 코드는 다음과 같습니다.

    defaultAutoCommit 속성을 사용해보십시오. 코드는 다음과 같습니다.

    <bean id="dataSource"
    class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
    p:driverClassName="${jdbc.driverClassName}"
    p:url="${jdbc.databaseurl}" p:username="${jdbc.username}"
    p:password="${jdbc.password}"
    p:defaultAutoCommit="false" />
    

    javadoc 살펴보기 : http://commons.apache.org/dbcp/apidocs/org/apache/commons/dbcp/BasicDataSource.html#defaultAutoCommit

  3. ==============================

    3.트랜잭션 내에서 코드를 실행하기 만하면 Spring은 자동 커밋을 자동으로 비활성화합니다. Spring에서 트랜잭션에서 코드를 실행하는 가장 쉬운 방법은 TransactionTemplate을 사용하는 것입니다.

    트랜잭션 내에서 코드를 실행하기 만하면 Spring은 자동 커밋을 자동으로 비활성화합니다. Spring에서 트랜잭션에서 코드를 실행하는 가장 쉬운 방법은 TransactionTemplate을 사용하는 것입니다.

    TransactionTemplate template = new TransactionTemplate(txManager);
    
    template.execute(new TransactionCallback<Object>() {
      public Object doInTransaction(TransactionStatus transactionStatus) {
        //ALL YOUR CODE ARE BELONG TO... SINGLE TRANSACTION
      }
    }
    
  4. from https://stackoverflow.com/questions/9649318/how-can-i-config-to-turn-off-autocommit-in-spring-jdbc by cc-by-sa and MIT license