본문 바로가기

Spring

[Spring mybatis] 트랜잭션(@Transactional)이 작동하지 않을 경우

1. mybatis 트랜잭션 설정 확인

- @EnableTransactionManager 어노테이션 적용

- PlatformTransactionManager 이 Bean으로 등록되어 있는지 확인

@Configuration
@EnableTransactionManagement
public class DBConfig {
	
	@Autowired
	private Environment env;

	@Bean
	public DataSource dataSource() {
		BasicDataSource dataSource = new BasicDataSource();
		dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
		dataSource.setUrl(env.getProperty("jdbc.url"));
		dataSource.setUsername(env.getProperty("jdbc.username"));
		dataSource.setPassword(env.getProperty("jdbc.password"));
		dataSource.setInitialSize(env.getProperty("jdbc.initialSize", Integer.class)); // 
		dataSource.setMaxActive(env.getProperty("jdbc.maxActive", Integer.class));
		
		return dataSource;
	}
	
	@Bean
	public PlatformTransactionManager transactionManager(DataSource dataSource) {
		return new DataSourceTransactionManager(dataSource); 
	}
}

 

 

2. 서비스단에 @Transactional 을 잘걸었는지 확인 (import는 org.springframework...)

@Transactional
@Override
public HashMap<String, Object> selectGridCenter(ReqModel param) throws Exception{

        sqlSession.getMapper(Mapper.class).insetTest(param);
        sqlSession.getMapper(Mapper.class).insetTest2(param);

        return null;
}

 

 

3. 모든 에러에 대해 트랜잭션을 적용하고 싶을 경우 rollbackFor 를 사용

@Override
@Transactional(rollbackFor = {Exception.class})
public HashMap<String, Object> selectGridCenter(ReqModel param) throws Exception{

        sqlSession.getMapper(Mapper.class).insetTest(param);
        sqlSession.getMapper(Mapper.class).insetTest(param);

        return mapData;
}

 

Error 

- LinkageError

- VirtualMachineError

 

Exception

- RuntimeException

- IOException

- AWTException

- SQLException