JDBC 데이터베이스 액세스 API (기본적으로 래퍼)를 구현 중이며 과 PlatformTransactionManager
이라는 스프링을 사용하여 트랜잭션 작업을 처리하고 있습니다. 모든게 괜찮아 보이지만 jdbcTemplate이 동시 트랜잭션을 관리하는 방법을 이해할 수 없습니다. 학생들의 창작을 토대로 간단한 예를 들어 설명하겠습니다. 2 명의 학생, John과 Jack을 만들어 보겠습니다. 첫 번째 오류가없는 초와 한 번의 오류가있는 초, 아래 단계와 코드가 있습니다.Spring PlatformTransactionManager - 동시 트랜잭션
- 요한은 트랜잭션을 시작
- 요한이없이 삽입 잭에 대한
- 기다립니다 잭이
- 잭 오류 (null를 세 만 데이터베이스에 필요한 비에 삽입 실행합니다 트랜잭션을 시작
- 삽입 커밋 실행 - NULL)
- 롤백 잭 트랜잭션
- 커밋 John trasaction
StudentDAO
public class StudentJDBCTemplate implements StudentDAO {
private DataSource dataSource;
private JdbcTemplate jdbcTemplateObject;
private PlatformTransactionManager transactionManager;
// constructor, getters and setters
public TransactionStatus startTransaction() throws TransactionException {
TransactionDefinition def = new DefaultTransactionDefinition();
transactionManager.getTransaction(def);
}
public void commitTransaction(TransactionStatus status) throws TransactionException {
transactionManager.commit(status);
}
public void rollbackTransaction(TransactionStatus status) throws TransactionException {
transactionManager.rollback(status);
}
public void create(String name, Integer age){
String SQL1 = "insert into Student (name, age) values (?, ?)";
jdbcTemplateObject.update(SQL1, name, age);
return;
}
}
MainApp에게 JdbcTemplate
1 트랜잭션이 확인하지만 다른 아니라고 알고 어떻게
public class MainApp {
public static void main(String[] args){
// setup db connection etc
StudentJDBCTemplate studentDao = new StudentJDBCTemplate();
TransactionStatus txJohn = studentDao.startTransaction();
TransactionStatus txJack = studentDao.startTransaction();
studentDao.create("John", 20);
try {
studentDao.create("Jack", null); // **FORCE EXCEPTION**
} catch(Exception e){
studentDao.rollback(txJack);
}
studentDao.commit(txJohn);
}
}
? 우리가 2 개의 트랜잭션을 생성 했음에도 불구하고 JdbcTemplate
은 쿼리와 실행 및 업데이트 메소드가 TransactionStatus를 매개 변수로 요구하지 않기 때문에 Jack AND John 트랜잭션을 롤백합니다. 즉, Spring jdbcTemplate은 시간당 1 개의 트랜잭션만을 지원합니까?!
트랜잭션은 스레드 기반이며 2 개의 스레드가 있으며 각 스레드마다 고유 한 상태가 있습니다. –
예제를 업데이트했습니다. 확인하십시오. 이제 jdbcTemplate이 studentDao.create 호출에서 사용할 transsaction을 어떻게 알 수 있습니까? – rmpt
샘플은 하나의 트랜잭션을 사용하지만 2는 사용하지 않습니다. 2. 'startTransaction'에 대한 두 번째 호출은 이미 진행중인 트랜잭션의 상태를 반환합니다. 디버그 로깅을 활성화하면 진행중인 트랜잭션에 참여하고 있음을 나타내는 디버그 메시지의 두 번째 시작 결과가 표시됩니다. 'REQUIRES_NEW'로 지정된 경우에만 새 트랜잭션을 시작합니다. 그렇지 않으면 단일 트랜잭션이 시작됩니다. 다중 스레드를 사용하는 경우에만 여러 트랜잭션을 가질 수 있습니다. –