스프링에서 트랜잭션 처리하면 validationquery는 한번만 날리나요?

조회수 1766회

validationQuery는 커넥션이 살아있는지 검사하는 쿼리로 알고 있습니다. 이때 스프링에서 트랜잭션 처리를 하고 2개의 쿼리를 날린다고 가정하면 validationQuery는 트랜잭션 시작전에 한번 만 호출되는것이 정상 아닌가요?

페이지 계산 때문에 SQL_CALC_FOUND_ROWS 함수와 FOUND_ROWS()함수를 한 트랜잭션에서 사용하는데 문제는 리스트 조회하는 쿼리 호출 후 validationquery가 다시 날아가서 FOUND_ROWS() 의 결과값이 항상 1로 리턴됩니다.

설정은 아래와 같습니다.

커넥터 : mysql-connector-java 버전 : 6.0.6

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8&serverTimezone=UTC
username=myadmin
password=1234

db-context.xml

<tx:annotation-driven transaction-manager="txManager" />
<util:properties id="jdbc" location="classpath:properties/#{systemProperties['spring.profiles.active']}/jdbc.properties" />
<bean id="dataSourceSpied" 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="defaultAutoCommit" value="false"/>
        <property name="testWhileIdle" value="true"/>
        <property name="validationQuery" value="SELECT 1"/> 
        <property name="timeBetweenEvictionRunsMillis" value="60000"/>
</bean>
<bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
        <constructor-arg ref="dataSourceSpied" />
        <property name="logFormatter">
            <bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter">
                <property name="loggingType" value="MULTI_LINE" />
                <property name="sqlPrefix" value="## SQL         : &#xA;&#x9;" />
            </bean>
        </property>
    </bean>

    <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations" value="classpath*:sql/**/*.xml" />
        <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
    </bean>

    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache" >
        <constructor-arg ref="sqlSessionFactoryBean"/>
    </bean>

    <!-- Transaction -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="get*"    read-only="true" />
            <tx:method name="select*" read-only="true" />
            <tx:method name="list*"   read-only="true" />
            <tx:method name="is*"   read-only="true" />
            <tx:method name="*" rollback-for="Exception" propagation="REQUIRED" isolation="REPEATABLE_READ" />
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut id="transactionPointcut"
            expression="서비스 클래스들 명시" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut" />
    </aop:config>

이미지

트랜잭션 아이콘도 보입니다.

페이지조회 함수 트랜잭션 (){
    SqlSession sqlSession
    A = sqlSession.selectList(페이지조회);
    B = sqlSession.selectOne(총건수조회);    
}

대략 위와 같이 서비스를 만들었을때 A를 호출하고 B를 찍어보면 항상 1이 찍힙니다. 그래서 validationQuery를 지워보니 정상적으로 건수가 찍히고여

heidsql 툴에서는 동시에 날려보면 row 수가 정상적으로 찍힙니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)