본문 바로가기
Java/네트워크 통신

[Java] 118. 코드 예제 : 트랜잭션을 이용해 MySQL 쿼리 내부에 데이터 생성하기

글: Song hyun 2024. 6. 12.
728x90
반응형

[Java] 118. 코드 예제 : 

트랜잭션을 이용해 MySQL 쿼리 내부에 데이터 생성하기


 

*문제:

블로그의 게시글, 유저, 댓글을 관리하는 m_board라는 테이블이 있다.

트랜잭션과 수동 커밋 기능을 사용해, 게시글과 댓글 레코드를 생성하고 조회해보자.

m_board 테이블 (MySQL)

 

 

*왜 수동 커밋을 사용하는가?

=> JDBC에서 디폴트는 자동 커밋이다. 만약 트랜잭션을 실행할 때, 한 실행문에서 오류가 발생한다면 그 구문만 실행이 되지 않고, 다른 곳에서는 실행이 되는 현상이 발생한다.

=> 디폴트=자동 커밋

=> 트랜잭션의 원자성(Atomicity)를 활용하기 위함!

 

좌측부터 순서대로 user / board / reply 를 트랜잭션을 사용해 업데이트한 모습이다!
setAutoCommit()은 괄호 안의 값이 false일 때만 호출할 수 있다. (기본값이 자동 커밋이기 때문!)


*전체 코드

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
반응형