-
[Spring] @Transactional사용법 ( 트랜잭션: transaction )Web/Servlet && Spring 2019. 8. 29. 21:35
Transaction이란? DBMS에서 수행하는 작업의 단위이다.
ACID 원자성, 일관성, 격리성, 지속성
여러 작업이 동시에 실행이 되어야 할때, 즉 한트랜잭션에 3가지 작업이 있다고 가정하고 1가지 작업에서 에러가 나면 이 트랜잭션은 중지 되어야 한다.
그래서 Spring에서 트랜잭션을 구현할 수 있다.
트랜잭션 설정방법
servlet-context.xml 내용 추가
<!-- 트랜잭션 사용하기 위해 --> <beans:bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- name은 DataSourceTransactionManager클래스의 변수 명이고 ref는 위의 dataSource를 DI하겠다는 것 --> <beans:property name="dataSource" ref="dataSource" /> </beans:bean>
servlet-context.xml 에서 Namespaces에서 tx체크 후 태그 하나 더 추가
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
StudentDAO.java 메소드 추가
private JdbcTemplate jdbcTemplate; // DataSource는 sql것으로 임포트 // 세터 주입방식 @Autowired public void setDataSource(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } public void create(Student student) { String sql = "INSERT INTO Student(id, name, age) values(?,?,?)"; jdbcTemplate.update(sql, student.getId(), student.getName(), student.getAge()); } // 학생수정 메소드 (일부러 잘못된 sql문 입력) public void update(Student student) { String sql = "INSERT INTO Student_Bad(id, name, age) values(?,?,?)"; jdbcTemplate.update(sql, student.getId(), student.getName(), student.getAge()); } //학생 입력 후 에러가 발생하는 학생 수정을 호출 @Transactional // 이 메소드에서 실행되는 작업은 전부 하나의 작업으로 처리되어서 하나가 에러나면 다른건 실행을 안한다. public void sampleTransaction(Student student) { this.create(student); this.update(student); }
Controller에서 호출
create메소드는 정상작동하지만 update는 에러가 난다. 이 메소드들을 @Transactional로 묶어 주면 하나의 작업 단위로 인식해 메소드 안의 인자가 하나라도 에러가 나면 실행이 되지 않는다.
반응형'Web > Servlet && Spring' 카테고리의 다른 글
[Mybatis] 마이마티스 두번째 사용방법 (@어노테이션) (0) 2019.08.31 [Mybatis] mybatis opening session 에러 (0) 2019.08.31 [Spring] mysql 에러 (mysql Data truncation: Incorrect string value:) (0) 2019.08.29 [Spring] mysql 연결 에러 해결 (deprecated) (0) 2019.08.29 [Spring] Logger 객체 사용법 (0) 2019.08.29