inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

PHP 7+ 프로그래밍

45 - MySQLi

PHP MySQLi 트랜잭션 처리에 대한 질문입니다.

해결된 질문

516

Henu

작성한 질문수 66

1

안녕하세요.

PHP 7 버전 문법 학습도 이제 거의 끝을 달리고 있습니다.

현재 JAVA 관련 또는 PHP 5 버전을 사용한 레거시 프로젝트의 유지보수 업무를 담당하고 있었기에 PHP 7 강의를 통해 최신 문법을 학습하고 기존 프로젝트를 리팩토링 할 수 있게 된 점에 대해 매우  보람찬 하루를 보내고 있습니다.

하지만 몇가지 궁금한 사항이 생겨 질문드립니다.

해당 강의 트랜잭션 처리 내용에서 두 가지 함수,

mysqli_autocommit($connection, false); // Auto commit 설정 해제

mysqli_commit($connection); // 수동으로 commit

를  배울 수 있었는데요.

예를 들어,

쇼핑몰 웹 사이트에 약 50명 정도의 클라이언트가 접속해 있고, 한명의 클라이언트가 상품을 주문할 때

주문정보 입력에 대하여모든 로직이 처리되기 전까지 Auto commit 설정을 비활성화 하고, 문제없이 모든 작업이 수행됬을 때 마지막에 수동으로 commit을 해주는 방식으로 트랜잭션 처리를 진행한다면, 여기서 동시성 문제가 있을 것 같다는 생각이 들었습니다.

mysqli_autocommit() 함수가 웹 사이트에 연결되어 있는 DB 전반적인 Auto commit 설정을 비활성화 한다면

(실제 DB 전체 Auto commit 설정을 변경하는 것인지, 아니면 기능 단위로 동작하는 것인지도 궁금합니다.)

A 클라이언트는 주문정보를 입력(별도의 Table에 주문 정보 저장 -> 주문 이력 저장 두 개의 작업이 수행)하고, B 클라이언트는 게시글을 작성할 때 

B 클라이언트의 작업이 먼저 끝나게 되어 A 클라이언트의 작업이 의도한 것처럼 동작하지 않는 상황이 올수도 있을까요?

만약, 그렇다면 어떻게 처리를 할 수 있는지 궁금합니다.

(예시 1)

A 클라이언트는 주문 정보 입력과 주문 이력이 모두 수행 된 후 commit이 되어야 하는데, B 클라이언트 작업이 종료되는 시점에서 mysqli_commit()이 실행되어 A 클라이언트의 주문 정보 입력이 중간에 commit 되어 버리는 상황

(예시 1)

A 클라이언트는 주문 정보 입력과 주문 이력이 모두 수행 된 후 commit이 되어야 하는데, B 클라이언트 작업이 종료되는 시점에서 에러가 발생하여 rollback이 실행되어 A 클라이언트의 주문 정보 도 rollback이 되는 상황...

또한, SQL Query를 다루는 PHP 구문이 한 소스파일에 있는 것이 아니라 여러 함수의 결합으로 동작을 할 때 트랜잭션 처리하는 방법도 궁금합니다.

긴 글 읽어주셔서 감사합니다.

php

답변 2

1

Henu

예를 들어, 쇼핑몰 웹사이트의 경우 A 고객이 상품을 주문할 때

주문정보(주문번호, 주문자 정보)와 주문상세정보(주문 상품들의  정보, 결제 정보)가 모두 입력된 경우 commit을 실행시키게 되는데,

(처리 속도가 느리다는 가정하에) 

주문정보 Query를 정상적으로 실행되고, 주문상세정보 Query를 실행하는 중 의도치 않게 브라우져가 종료가 되어 Error Catch가 안되는 시점에서 같은 시간에 B 고객은 모든 작업을 성공적으로 처리 했을 때

A 고객의 주문정보는 이미 실행된 Query이기 때문에 DBMS 실행 쿼리 임시 저장공간(?)에 commit/rollback 대기상태로 남아있을거라 생각이 되어실제 B 고객으로 하여금 A 고객의 주문정보가 저장이 되는지 검증을 진행하면서 개발해야겠습니다. 

고려해볼 사항이 많을 것 같습니다!

언급해 주신 DBMS ACID 원칙은 정보처리기사를 취득할 때 DBMS Part에서 이론적으로만 배웠던 내용인데

이렇게 실무에서 다시 한번 상기시키게 되다니, 답변 감사드립니다.

1

정상우

안녕하세요 :)

Auto Commit 을 해제하게 되면 해당 커넥션에 대한 Auto Commit 기능이 꺼집니다. 그리고 트랜잭션 동시성에 관련된 문제는 DBMS(Database Management System)의 구현부분에서 2 Level Lock 방식 등을 통해 ACID(원자성, 일관성, 고립성, 지속성) 원칙에 의해 보호됩니다. 따라 크게 트랜잭션의 동시성 문제에 대해서는 걱정을 하실 필요는 없다고 생각됩니다. 일반적으로는 신경을 잘 쓰지는 않는데 정보처리기사와 전공과목을 공부할때 배운 지식을 여기서 써먹는군요. 다시 리마인드해볼 수 있는 좋은 질문입니다. (컴퓨터공학과의 '데이터베이스' 관련 과목에서 알아볼 수 있음)

SQL Query 가 여러 파일로 나뉘어도 결국에는 자동 커밋을 해제하는 것이 상단에 있을 것이고, 언젠가는 수동으로 커밋하는 것이 있겠죠. 그게 자동커밋 해제 이후 어느 시점이든지. 자동 커밋을 쓴 순간부터 롤백이나 커밋을 하지 않는 이상은 처리되지 않기 때문에, 컨트롤러에서 검증한 뒤 응답을 주기 전에 처리해주거나 해주면 될듯합니다. :)

53강 레이아웃에서 css git 링크 관련 질문입니다.

0

35

2

[섹션 5]레포지토리 소스파일 오류 위치, 수정 제안

0

180

1

add configuratio.. 자체에

0

268

2

터미널에 글이 안써집니다.

0

635

1

일반적으로 쓰이지 않는 폰트 부분

0

465

1

readmore 클릭시 쿼리내용 받아오는게 이해가 안되요

0

497

1

$_GET과 $_POST를 구별하여야한다고 하는데 이건 왜 $_GET입니까 콜백이라서 그런가요? 왜콜백은 그래도 되나요?

0

475

1

xdebug 설치가 안됩니다.

0

401

1

xdebug 설치 확인 페이지가 안열립니다

0

360

1

if ~ elseif ~ else 문법 표준적인 코딩 방법에 대한 질문입니다.

1

523

1

mysqli_stmt_close($stmt) 관련 질문드립니다.

0

319

1

DB_CONNECTION 부분 질문

0

267

1

FILTER_VALIDATE FILTER_SANITIZE 차이를 모르겠습니다.

0

296

1

결과 ...

0

244

1

random_bytes

0

319

1

preg_replace_callback 질문드립니다.

0

435

1

호스팅에 php 코드 업로드하면 hash 로직이 보이진 않을까요?

0

266

1

버퍼링 궁금한 점이 있습니다.

0

287

1

restore_include_path 오류

0

316

1

php 에러발생..

0

3759

3

터미널로 php 실행시 document root 지정

0

244

1

posts가 null이라고 나옵니다.

0

209

2

rand() vs random_int() 차이점?

0

518

1

php 8 로 하시는 분들을 위한 ini 팁

1

513

1