Spring F/W @Transactional commit 설정 문의

조회수 1113회

안녕하세요 스프링 프레임워크 테스트중에 @Transactional 테스트중에 의문사항이 발생하여 문의드립니다. 정상적으로 insert 된 이후에 확인해보면 DB에 insert가 되고 있지 않은 상황입니다. commit 관련된 설정이 있는 건가요? 어떤이유에서 발생하는지 알고 싶네요..

증상 : 정상 INSERT된 Data commit되지 않음
@Transactional 어노테이션 제거시 정상 insert 확인됨

환경 : Java JDK8 , maven, Spring F/W , Mysql


    <!-- Spring context Setting  -->


<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
    <property name="url" value="jdbc:log4jdbc:mysql://127.0.0.1:3306/book_ex"></property>
    <property name="username" value="test"></property>
    <property name="password" value="test"></property>
</bean> 

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

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>


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

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




JUnit Test code 

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="file:src/main/webapp/WEB-INF/spring/**/*.xml")
public class BooksTest {

    @Autowired
    private BooksDao booksDao;

    @Autowired
    private DataSourceTransactionManager transactionManager;

    @Test
    @Transactional(isolation=Isolation.READ_COMMITTED, propagation=Propagation.REQUIRED, rollbackFor=SQLException.class, timeout=10)
    public void testInsertTransaction_트랜잭션테스트() throws Exception {

        Books book1 = new Books("처음만나면", 1000);
        Books book2 = new Books("반갑습니다", 2000);
        booksDao.save(book1, book2);

    }



Persistence Layer


@Repository("booksDaoImpl")
@Transactional(isolation=Isolation.READ_COMMITTED, propagation=Propagation.REQUIRED, rollbackFor=SQLException.class, timeout=10)
public class BooksDaoImpl implements BooksDao{


    //@Autowired
    @Resource(name="sqlSession")
    private SqlSession session;

    private static final Logger logger = LoggerFactory.getLogger(BooksDaoImpl.class);
    private static String namespace = "com.transaction.test.booksMapper";


    @Transactional(isolation=Isolation.READ_COMMITTED, propagation=Propagation.REQUIRED, rollbackFor=SQLException.class, timeout=10)
    @Override
    public void save(Books book1, Books book2) throws Exception {
        addBook1(book1);
        addBook2(book2);
    }

    //@Transactional
    @Override
    public void addBook1(Books book) throws Exception {
        session.insert(namespace+".addBooks1", book);
    }

    //@Transactional
    @Override
    public void addBook2(Books book) throws Exception {
        session.insert(namespace+".addBooks2", book);
    }




 Mapper Layer 



<insert id="addBooks1" parameterType="com.test.app.vo.Books">
INSERT INTO books
(
 book_title, price
)
VALUES
(
    #{bookTitle}, #{price} 
)

</insert>

<insert id="addBooks2" parameterType="com.test.app.vo.Books">
INSERT INTO books2
(
     book_title, price
)
VALUES
(
    #{bookTitle}, #{price} 
)

</insert>



이미지

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

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

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

(ಠ_ಠ)
(ಠ‿ಠ)