SPRING/스프링
[스프링] 9. 트랜잭션 설정
추억을 백앤드하자
2021. 4. 17. 08:04
728x90
반응형
SMALL
현재 두개의 테이블을 만들어 트랜잭션 테스트를 할 생각이다.
tbl_sample1 는500바이트 tbl_sample1 는 50바이트의
각자 다른 컬럼 수용값을 지정하였다.
#글자수가 50바이트가 넘어가는 insert 테스트
public interface Sample1Mapper {
@Insert("insert into tbl_sample1 (col1) values (#{data})")
public int insertCol1(String data);
}
public interface Sample2Mapper {
@Insert("insert into tbl_sample2 (col2) values (#{data})")
public int insertCol2(String data);
}
public class SampleTxServiceImpl implements SampleTxService{
@Setter(onMethod_= {@Autowired})
private Sample1Mapper mapper1;
@Setter(onMethod_= {@Autowired})
private Sample2Mapper mapper2;
@Override
public void addData(String value) {
log.info("mapper1..........................");
mapper1.insertCol1(value);
log.info("mapper2..........................");
mapper2.insertCol2(value);
log.info("end...........................");
}
}
테스트코드
public class SampleTxServiceTests {
@Setter(onMethod_= {@Autowired})
private SampleTxService service;
@Test
public void testLong() {
String str="Starry\r\n"+
"Starry night\r\n" +
"Paint your palette blue and grey\r\n"+
"Look out on a summer's day";
log.info(str.getBytes().length);
service.addData(str);
}
}
해당 오류와 함께
tbl_sample1 에만 데이터가 들어간것을 확인할수있고
이는 트랜잭션의 acid 원칙에 위배된다.
입금과 출금을 예로 들었을때
분명 사용자는 입금을 진행하였는데
입금대상 계좌에는 돈이 안들어오고 막상 사용자의 계좌는 돈이 빠져나간 이런 상황이 발생한것이다.
@Transactional 어노테이션을 적용하여 트랜잭션의 원칙을 지켜보자
기존 코드에서 추가
public class SampleTxServiceImpl implements SampleTxService{
@Setter(onMethod_= {@Autowired})
private Sample1Mapper mapper1;
@Setter(onMethod_= {@Autowired})
private Sample2Mapper mapper2;
@Transactional
@Override
public void addData(String value) {
log.info("mapper1..........................");
mapper1.insertCol1(value);
log.info("mapper2..........................");
mapper2.insertCol2(value);
log.info("end...........................");
}
}
테이블 비우고 다시 테스트를 진행하면 오류와 함께
적용이 안됨을 확인할 수 있다.
728x90
반응형
LIST