- [Java] 118. 코드 예제 : 트랜잭션을 이용해 MySQL 쿼리 내부에 데이터 생성하기2024년 06월 12일
- Song hyun
- 작성자
- 2024.06.12.:29
728x90반응형[Java] 118. 코드 예제 :
트랜잭션을 이용해 MySQL 쿼리 내부에 데이터 생성하기
*문제:
블로그의 게시글, 유저, 댓글을 관리하는 m_board라는 테이블이 있다.
트랜잭션과 수동 커밋 기능을 사용해, 게시글과 댓글 레코드를 생성하고 조회해보자.
*왜 수동 커밋을 사용하는가?
=> JDBC에서 디폴트는 자동 커밋이다. 만약 트랜잭션을 실행할 때, 한 실행문에서 오류가 발생한다면 그 구문만 실행이 되지 않고, 다른 곳에서는 실행이 되는 현상이 발생한다.
=> 디폴트=자동 커밋
=> 트랜잭션의 원자성(Atomicity)를 활용하기 위함!
*전체 코드
package ch04; import java.lang.invoke.StringConcatFactory; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Connection; public class TransactionExample2 { public static void main(String[] args) { // 트랜잭션을 통해 // m_board라는 쿼리 내부에 게시글, 댓글 레코드를 생성해보자. String url="jdbc:mysql://localhost:3306/m_board?serverTimezone=Asia/Seoul"; String id="root"; String password="asd123"; try (Connection conn=DriverManager.getConnection(url,id,password)){ Class.forName("com.mysql.cj.jdbc.Driver"); conn.setAutoCommit(false); String sqlInsert="Insert into user(username,password,email,userRole,address,createDate)" +"values (?,?,?,?,?,now())"; String sqlInsert1="Insert into board(userId,title,content,readCount)" + "values (?,?,?,?);"; String sqlInsert2="Insert into reply(userId,boardId,content,create_date)" +"values (?,?,?,now())"; // INSERT(user) PreparedStatement psmt=conn.prepareStatement(sqlInsert); psmt.setString(1, "파르네제"); psmt.setString(2, "asd1333"); psmt.setString(3,"asd133@nate.com"); psmt.setString(4,"user"); psmt.setString(5, "부산시 남구"); psmt.executeUpdate(); // 실행 // INSERT(board) PreparedStatement psmt1=conn.prepareStatement(sqlInsert1); psmt1.setInt(1, 1); psmt1.setString(2,"first commit"); psmt1.setString(3,"JDBC 정말 어렵네요..."); psmt1.setInt(4,100); psmt1.execute(); // INSERT(reply) PreparedStatement psmt=conn.prepareStatement(sqlInsert); psmt2.setInt(1,6); psmt2.setInt(2,6); psmt2.setString(3,"그쵸 ㅠㅠ 너무 어려워요"); psmt2.executeUpdate(); conn.commit(); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } }
*자동 커밋-트랜잭션 예시
package ch04; import java.lang.invoke.StringConcatFactory; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Connection; public class TransactionExample2 { public static void main(String[] args) { // 트랜잭션을 통해 // m_board라는 쿼리 내부에 게시글, 댓글 레코드를 생성해보자. String url="jdbc:mysql://localhost:3306/m_board?serverTimezone=Asia/Seoul"; String id="root"; String password="asd123"; try (Connection conn=DriverManager.getConnection(url,id,password)){ Class.forName("com.mysql.cj.jdbc.Driver"); conn.setAutoCommit(true); String sqlInsert="Insert into reply(userId,boardId,content,create_date)" +"values (?,?,?,now())"; // INSERT(reply) PreparedStatement psmt=conn.prepareStatement(sqlInsert); psmt.setInt(1,6); psmt.setInt(2,6); psmt.setString(3,"맞아요 MySQL이 훨 나은듯요"); psmt.executeUpdate(); conn.commit(); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } }
728x90반응형'Java > 네트워크 통신' 카테고리의 다른 글
[Java] 120. JDBC를 활용한 CRUD와 SOLID 원칙 (1) (0) 2024.06.14 [Java] 119. 트랜잭션과 배치 처리 (0) 2024.06.13 [Java] 117. 트랜잭션의 개념과 트랜잭션 관리 (0) 2024.06.12 [Java] 115. 코드 예제: JDBC를 활용하여 CRUD 해보기 (0) 2024.06.11 [Java] 114. JDBC 사용법 (2) (0) 2024.06.11 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)