2011-11-25 3 views
5

최대 절전 모드로 데이터베이스에 수행 된 쿼리 양에 문제가 있습니다. 다음은 간단한 선택을하는 데이터베이스 (MySQL은 5.1을 사용) 내 쿼리 로그입니다 : 내가 아는 내가 1로 다음 0으로 자동 커밋을 설정하고에 대해 많이 읽은데이터베이스에 대한 최대 절전 모드

111125 7:18:30 
27 Query SET autocommit=0 
27 Query SELECT @@session.tx_isolation 
27 Query select this_.id as id34_0_, this_.media_id as media3_34_0_, this_.message as message34_0_, this_.user_id as user4_34_0_ from notifications this_ 
27 Query rollback 
27 Query SET autocommit=1 

그 연결의 기본 1이고이 동작을 변경할 수 없습니다. SET autocommit = 0을 실행할 수 있지만 결과는 같습니다.

어쨌든 이러한 쿼리를 피할 수 있습니까? SELECT @@ session.tx_isolation이 발생하고 롤백되는 이유를 모르겠습니다. 트랜잭션을 사용할 때 커밋을 한 다음 롤백합니다. 롤백이 항상 케이블로 연결된 이유를 잘 모릅니다.

고맙습니다.

내 conf의 : 봄 2.5.6, 3.6.0 최대 절전 모드, MySQL은 5.1

datasoure.xml :

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

    <property name="initialSize" value="3" /> 
    <property name="maxActive" value="20" /> 
    <property name="minIdle" value="3" /> 
    <property name="poolPreparedStatements" value="false" /> 
    <property name="defaultAutoCommit" value="false" /> 
    <property name="defaultTransactionIsolation" value="4" /> 
</bean> 

트랜잭션 관리자 정의 :

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

UPDATE : 새 속성을 설정하여 롤백을 제거하도록 관리 됨

<property name="defaultReadOnly" value="true" /> 

하지만 문제는 이제 SQLException을 제공하는 db에 대한 트랜잭션 주석 (readOnly = false)을 설정했는지에 관계없이 수정할 수 없다는 것입니다. 이 등록 정보는 읽기 전용으로 연결을 true로 설정합니다. 나는 이것을 HibernateTemplate으로 할 수있는 방법이 없다고 생각한다.

내부 코드 직조를 위해 aspectj 트랜잭션을 사용합니다.

<aop:aspectj-autoproxy proxy-target-class="true" /> 
+0

거래가 실패합니다! Spring 컨텍스트에서 트랜잭션 관리자를 활성화 했습니까? 그리고 로그는 정상이며 내 역할은 롤백을 제외하고는 비슷합니다. – madhead

+0

그것은 단지 선택이고 @transactional 어노테이션이 없습니다. 모든 것이 거래로 취급되고있는 것 같습니다. – Gonzalo

+0

원시 DB 수준을 의미합니다 : 27 쿼리 롤백. 트랜잭션을 롤백합니다. 삽입 또는 업데이트가 올바르게 작동합니까? – madhead

답변

1

응용 프로그램에 대한 트랜잭션을 구성해야합니다. Spring 2.5.x documentation on transaction management을 참조하십시오.

편집 12/3/11 : 선택 만하는 방법 인 경우에도 게시물에서 언급 한 추가 검색어를 삭제하려면 읽기 전용 트랜잭션을 만들어야합니다. @Transactional (readOnly = true)을 쓰면 좋을 것입니다.

편집 12/20/11 : 트랜잭션이 올바르게 구성되어 있는지도 확인해야합니다. 게시 한 구성이 누락되었을 수 있습니다. < tx : annotation-driven /> annotation. section 10.5.1 of the Spring documentation을 참조하십시오.

+0

트랜잭션 관리자를 추가했습니다. 트랜잭션을 필요로 할 때 @transactional 어노테이션을 사용하지만이 경우에는 아무 트랜잭션도 일어나지 않습니다. – Gonzalo

+0

선택 만하는 메소드의 경우에도 게시물에서 언급 한 추가 쿼리를 제거하려면 읽기 전용 트랜잭션을 만들어야합니다. @Transactional (readOnly = true)을 쓰면 좋을 것입니다. – user393274

+0

여전히 동일한 트랜잭션 롤백과 자동 커밋을 얻습니다. readonly = true로 커밋을 얻습니다. – Gonzalo