꾸준히 안타치기
트랜잭션 본문
문제) 게시글 테이블과, 북마크 테이블이 있다. 북마크 테이블은 게시글에서 좋아요를 누른 것들을 담아둔 것인데(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
https://coding-factory.tistory.com/226
https://www.php.net/manual/en/mysqli.rollback.php
'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 |