Transaction
은 Data Base에서 사용되는 쪼갤 수 없는 업무처리의 단위이다.
실생활에서 하나 이상의 동작이지만 분리해서 실행 할 수 없는 상황에는 무엇이 있을까
// transaction 사용 예시
// HomeDAO
public void insert() throws SQLException {
// 1. 정상적인 insert문
// 2. 잘못된 insert문
// 3. 결과 : 잘못된 insert문에서 예외 발생시 정상적인 insert문도 취소
String sql = "INSERT INTO member(id, pw, name, age, gender, email) VALUES(?, ?, ?, ?, ?, ?)";
// 같은 쿼리를 두번 날릴때 두번째는 PK 중복으로 예외가 발생한다.
// 트랜잭션을 적용하면 첫번째 쿼리문도 취소 되어야 한다.
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "tx_manager");
pstmt.setString(2, "1234");
pstmt.setString(3, "관리자");
pstmt.setInt(4, 20);
pstmt.setString(5, "남자");
pstmt.setString(6, "tranx@email.com");
int row = pstmt.executeUpdate();
logger.info("SQL 1 = "+row);
// java.sql.SQLSyntaxErrorException: (conn=9) You have an error in your SQL syntax;
// check the manual that corresponds to your MariaDB server version for the right syntax to use near '?, ?, ?, ?, ?, ?)' at line 1
row = pstmt.executeUpdate(sql);
logger.info("SQL 2 = "+row);
}
// HomeService
public class HomeService {
Logger logger = LoggerFactory.getLogger(this.getClass());
HomeDAO dao = null;
public boolean connect() {
logger.info("DAO에 DB접속 요청");
dao = new HomeDAO();
// dao 객체의 conn변수에 어떻게 접근하나?
boolean success = dao.conn == null ? false : true;
if(success) {
try {
// transaction은 한 method에서 동시 실행되는 쿼리가 있을 경우 사용한다. (일반적으로)
// 여러 method가 있다고 하더라도 , 모두 select문이라면 사용할 필요가 없다. ( 데이터가 변하지 않으니 )
dao.conn.setAutoCommit(false); // auto commit 기능 끄기
dao.insert();
dao.conn.commit(); // 확정
} catch (Exception e) {
e.printStackTrace();
try {
dao.conn.rollback(); // 예외가 발생하면 되돌리기
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
dao.close();
return success;
}