꾸준히 안타치기

트랜잭션 본문

Server & DB

트랜잭션

글자줍기 2022. 6. 16. 19:29
반응형

문제) 게시글 테이블과, 북마크 테이블이 있다. 북마크 테이블은 게시글에서 좋아요를 누른 것들을 담아둔 것인데(Left Join으로)

게시글을 지웠을때 북마크에 이상하게 이미지가 중복 출력이 되는 현상이 있었다...

원인은 게시글을 지웠을때 연관된 북마크의 게시글이 Null로 그대로 남아있어서 생기는 오류였다.

게시글을 지울때 먼저 북마크 되어있는 게시글을 먼저 지우고 부모 게시글을 삭제해야 깔끔하게 삭제된다.

 

연관된 테이블중 부모테이블만 지웠기에 부모테이블에서 정보를 가져오는 북마크 테이블은 데이터가 빈상태.. 함께 지워줘야한다.

이 때 쿼리를 두 번 실행해야하는데 트랙잭션이라는 개념을 알게 됬다.

 

첫번째 쿼리를 실행하다가 서버에 이상이 생긴다면 두번째만 실행되거나, 첫번째만 실행되거나? 오류나 가더나 하는등의 문제가 있을 수 있다. 이때 트랜잭션을 사용하면 여러개의 쿼리중 하나의 쿼리라도 문제가 있으면 다시 rollback하고 모든 쿼리가  완벽히 실행됬을 때에만 Commit 해줄수 있다.

 

해결)

트랜지션을 적용후 연관된 북마크 테이블의 데이터를 삭제하는 쿼리를 추가하고, 게시글을 삭제했다.

 

트랜잭션이란?

https://www.youtube.com/watch?v=eSyvtg_PeII&t=5s Jacob's Lecture

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$mysqli->query("CREATE TABLE Language LIKE CountryLanguage");

/* set autocommit to off */
$mysqli->autocommit(FALSE);

/* Insert some values */
$mysqli->query("INSERT INTO Language VALUES ('DEU', 'Bavarian', 'F', 11.2)");
$mysqli->query("INSERT INTO Language VALUES ('DEU', 'Swabian', 'F', 9.4)");

/* commit transaction */
$mysqli->commit();

/* drop table */
$mysqli->query("DROP TABLE Language");

/* close connection */
$mysqli->close();
?>

https://stackoverflow.com/questions/12091971/how-to-start-and-end-transaction-in-mysqli

 

How to start and end transaction in mysqli?

As far as I understood transaction starts once we call $mysqli->autocommit(FALSE); statement and ends after calling $mysqli->commit(); command like in the example below. <?php //Start

stackoverflow.com

https://coding-factory.tistory.com/226

 

[DB기초] 트랜잭션이란 무엇인가?

 트랜잭션의 정의 트랜잭션(Transaction)은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다. 트

coding-factory.tistory.com

https://www.php.net/manual/en/mysqli.rollback.php

 

PHP: mysqli::rollback - Manual

Just a note about auto incremental ids and rollback.When using transactions and inserting into a table containing a column with auto incremental ids, the id will be incremented even though the transaction is rolled back.This might occupy a lot of ids if a

www.php.net

 

반응형

'Server & DB' 카테고리의 다른 글

index란?  (0) 2022.12.15
RDBMS, 관계형데이터베이스, Join  (0) 2022.12.15
소켓 사용하기 / 부스트코스  (0) 2021.10.24
foreignKey  (0) 2021.10.21
DB 한글 ?, 물음표  (0) 2021.10.01
Comments