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>
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력