728x90

php 작업중 여러 테이블에 데이터를 insert 할때는 트랜지션을 걸고 모든 데이터가 완료 되었을때 commit 을하고 하나라도 오류가 있을 경우에는 rollback 작업을걸어 준다. 이때 insert 하고 난 데이터는 마지막에 commit 되기 때문에 excute 에서는 데이터 조회가 되지 못하는데 설정값을 트랜지션 시작 지점 위에 선언해 주면 excute 까지만 되어도 해당 데이터는 insert 된것으로 인지하고 select 문을 실행한다. 

 

$pdo->exec("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
try {
    // 데이터베이스 연결 설정
    $pdo = new PDO('mysql:host=localhost;dbname=your_database', 'username', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 트랜잭션 격리 수준 설정
    $pdo->exec("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");

    // 트랜잭션 시작
    $pdo->beginTransaction();

    // 삽입할 데이터 배열
    $dataToInsert = [
        ['value1' => '데이터1', 'value2' => '데이터2'],
        ['value1' => '데이터3', 'value2' => '데이터4'],
        // 추가 데이터...
    ];

    // 데이터 삽입 및 체크
    foreach ($dataToInsert as $data) {
        // 데이터 삽입
        $stmt = $pdo->prepare("INSERT INTO your_table (column1, column2) VALUES (:value1, :value2)");
        $stmt->execute([':value1' => $data['value1'], ':value2' => $data['value2']]);

        // 삽입된 데이터 체크
        $lastId = $pdo->lastInsertId();
        $checkStmt = $pdo->prepare("SELECT * FROM your_table WHERE id = :id");
        $checkStmt->execute([':id' => $lastId]);
        $result = $checkStmt->fetch();

        if (!$result) {
            // 데이터가 존재하지 않으면 롤백하고 종료
            $pdo->rollBack();
            echo "데이터 삽입에 실패했습니다: " . $data['value1'];
            exit;
        }
    }

    // 모든 데이터가 정상적으로 삽입되면 커밋
    $pdo->commit();
    echo "모든 데이터가 성공적으로 삽입되었습니다.";

} catch (Exception $e) {
    // 예외 처리
    $pdo->rollBack();
    echo "오류 발생: " . $e->getMessage();
}
 

 

 

트랜지션에는 4가지 종류가 있는데 각 상황에 맞게 시작지점에 선언해 주면 된다.

 

 

READ UNCOMMITTED: 다른 트랜잭션이 커밋하지 않은 변경 사항을 읽을 수 있습니다. (Dirty Reads 가능)
READ COMMITTED: 다른 트랜잭션이 커밋한 변경 사항만 읽을 수 있습니다. (Dirty Reads 방지)
REPEATABLE READ: 트랜잭션 시작 시점의 데이터를 읽습니다. (Phantom Reads 방지)
SERIALIZABLE: 가장 높은 격리 수준으로, 트랜잭션이 직렬화된 것처럼 동작합니다. (Phantom Reads 및 모든 충돌 방지)

 

한참 찾았는데 실제로 내가 해봤을때 되는 코드는 READ UNCOMMITTED 설정이니 참고 하면 좋겠다.

728x90

+ Recent posts