트랜잭션은 데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위이다. 상태를 변화시킨다는 것은 SQL 질의어를 통해 DB에 접근하는 것을 의미한다. 예를 들어, SELECT, INSERT, DELETE, UPDATE 명령어를 통해 데이터베이스에 변화를 주는 작업들이 트랜잭션에 포함된다.
트랜잭션은 많은 SQL 명령문들을 사람이 정하는 기준에 따라 묶은 작업 단위를 의미한다. 예를 들어, 게시판에서 사용자가 글을 작성하고 올리기 버튼을 누른 후 게시판에 다시 돌아오면 게시판에 내가 쓴 글이 업데이트된 상태를 볼 수 있다.
이때 DB 작업:
현재 작업 단위는 INSERT문과 SELECT문을 포함한다. 이를 통틀어 하나의 트랜잭션이라고 한다. 즉, 하나의 트랜잭션 설계를 잘 만드는 것이 데이터를 다룰 때 많은 이점을 가져다준다.
하나의 트랜잭션이 성공적으로 끝났고, DB가 일관성 있는 상태일 때 이를 알려주기 위해 사용하는 연산이다.
하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨진 경우, 트랜잭션이 정상적으로 종료되지 않았을 때, 마지막 일관성 있는 상태로 롤백할 수 있다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class TransactionExample {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "username", "password");
conn.setAutoCommit(false); // 트랜잭션 시작
stmt = conn.createStatement();
String sql1 = "INSERT INTO posts (title, content) VALUES ('My Post', 'This is my first post')";
stmt.executeUpdate(sql1);
String sql2 = "UPDATE users SET post_count = post_count + 1 WHERE user_id = 1";
stmt.executeUpdate(sql2);
conn.commit(); // 트랜잭션 커밋
System.out.println("Transaction committed successfully.");
} catch (SQLException se) {
if (conn != null) {
try {
conn.rollback(); // 트랜잭션 롤백
System.out.println("Transaction rolled back.");
} catch (SQLException e) {
e.printStackTrace();
}
}
se.printStackTrace();
} finally {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException se) {
se.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException se) {
se.printStackTrace();
}
}
}
}
}
트랜잭션은 데이터베이스에서 작업을 수행할 때 원자성, 일관성, 독립성, 지속성을 보장하는 중요한 개념이다. 트랜잭션을 통해 데이터의 무결성을 유지하고, 에러 발생 시 안전하게 롤백할 수 있다. 따라서 데이터베이스 작업 시 트랜잭션의 적절한 사용은 매우 중요하다.