• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

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

20.10.14 23:33 작성 조회수 252

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 구문이 한 소스파일에 있는 것이 아니라 여러 함수의 결합으로 동작을 할 때 트랜잭션 처리하는 방법도 궁금합니다.

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

답변 2

·

답변을 작성해보세요.

1

Henu님의 프로필

Henu

질문자

2020.10.17

예를 들어, 쇼핑몰 웹사이트의 경우 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 가 여러 파일로 나뉘어도 결국에는 자동 커밋을 해제하는 것이 상단에 있을 것이고, 언젠가는 수동으로 커밋하는 것이 있겠죠. 그게 자동커밋 해제 이후 어느 시점이든지. 자동 커밋을 쓴 순간부터 롤백이나 커밋을 하지 않는 이상은 처리되지 않기 때문에, 컨트롤러에서 검증한 뒤 응답을 주기 전에 처리해주거나 해주면 될듯합니다. :)