2012-03-10 4 views
12

JDBC를 사용하여 Spring을 사용 중이고 자동 커밋 인 것으로 나타났습니다.Spring + JDBC에서 자동 커밋을 해제하려면 어떻게해야합니까?

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> 

답변

14

내 구성이 줄을 놓친 것 같습니다 : 내 서비스 클래스에서, 그리고

<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. 2018 : 그러나, 이것은 당신이 다른 클래스를 작성해야하는 이유 REQUIRES_NEW를 사용하려면

업데이트 (그렇지 않으면 당신은 정말 새로운 트랜잭션을 생성하지 않습니다 REQUIRES_NEW 것 같습니다이 문제 Spring Transaction propagation REQUIRED, REQUIRES_NEW을 얻을 것이다) 것을 설명 할 수있다 -01-01 : 스프링 부트 1.5.8로 전체 예제를 만들었습니다.여기에 출시 https://www.surasint.com/spring-boot-database-transaction-jdbi/ 및 일부 기본 실험 예제 https://www.surasint.com/spring-boot-connection-transaction/

+0

그리고 스프링 트랜잭션 관리자가 자동 ​​커밋을 해제하고 자체 커밋을 수행했기 때문에 이것이 효과가 있었습니까? – Raedwald

2

당신은 단순히 트랜잭션 내에서 코드를 실행할 수 없습니다, 봄이 자동으로 비활성화됩니다 자동 위탁 당신을 위해. 봄 트랜잭션 코드의 조각을 실행하는 가장 쉬운 (이상하는 설정) 방법은 TransactionTemplate을 사용하는 것입니다

TransactionTemplate template = new TransactionTemplate(txManager); 

template.execute(new TransactionCallback<Object>() { 
    public Object doInTransaction(TransactionStatus transactionStatus) { 
    //ALL YOUR CODE ARE BELONG TO... SINGLE TRANSACTION 
    } 
} 
+0

답을 보내 주셔서 감사합니다. 더 큰 그림을 지원하기 위해 Spring은 단순한 JDBC에 대해 더 많은 복잡성을 생성합니다. :) –

+0

@SurasinTancharoen : 글쎄,별로. 나는 사용하기 쉽지만 설치하기 쉽다고 * 말했다. '@ Transactional' 또는 AOP를 사용하면 코드 변경을 최소화하면서 단일 트랜잭션 내에서 여러 줄의 코드를 실행할 수 있습니다. –

+0

방금 ​​읽은 방금 http://www.ibm.com/developerworks/java/library/j-ts2/index.html "스프링을 사용한 프로그램 방식의 트랜잭션"을 대안으로 사용할 수 있습니까? –

6

이 defaultAutoCommit 속성을보십시오. 코드는 다음과 같습니다 javadoc의에서

<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" /> 

찾는 위치 : http://commons.apache.org/dbcp/apidocs/org/apache/commons/dbcp/BasicDataSource.html#defaultAutoCommit

관련 문제