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 |