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
'PHP' 카테고리의 다른 글
음수, 양수 변환 해서 저장하기 (1) | 2024.11.10 |
---|---|
php 엑셀다운로드 업로드 spreadsheet (3) | 2024.11.09 |
php 단방향 암호화 예제 (0) | 2024.07.09 |
tcpdf html 코드 pdf 로 다운로드 하는 방법 php 버전 (0) | 2024.03.27 |
php 파일명세서 작성시 폴더 내 파일명 모두 출력하기 (0) | 2024.03.20 |