2013-07-17 5 views
0

도움이 필요합니다.MySQL 트랜잭션을 올바르게 사용하는 방법

다른 파일이 있습니다. 예를 들어 :

  • 의 index.php, news.php
  • 포함-스크립트와 같은 : facebook.php, pay.php 등을.

모든 페이지 (news.php 제외)에서 트랜잭션은 스크립트 시작 부분에서 시작되고 스크립트 끝 부분에서 종료됩니다.

index.php와 news.php와 같은 페이지에는 pay.php가 포함되어 있습니다. 그러나 문제는 다음과 같습니다. index.php를 방문하면 트랜잭션이 이미 시작되었으므로 이제 두 개의 트랜잭션이 활성화됩니다! 하지만 나는 pay.php에서 트랜잭션 시작을 제거 할 수 없습니다. 왜냐하면 news.php에서 스크립트를 호출하면 활성화 된 트랜잭션이 없기 때문입니다.

(내 웹 사이트는 더 많은 페이지와 사물과 훨씬 더 복잡합니다.)

누군가 나를 도와 줄 수 있습니까? 감사!

+0

좀 더 명확하게 설명해야합니다. 어떤 종류의 거래입니까? –

+0

MySQL 트랜잭션입니다. 마찬가지로 http://stackoverflow.com/questions/2708237/php-mysql-transactions-examples – Jordy

+0

@jordy 잘 중지 :) ... 당신은 정말 최신 데이터베이스 엔진 중 하나를 채택해야 ... mysql 확장은 사용되지 않습니다. – Orangepill

답변

1

중첩 된 트랜잭션을 에뮬레이션하는 것이 가장 좋습니다. 이렇게하려면 데이터베이스 액세스에 대한 래퍼를 작성하십시오. (pseduocode)

class MyMysqli { 
    protected $realDb; 
    protected $transaction_count =0; 

    public function __construct ($host, $username , $passwd, $dbname){ 
     $this->realDb = new Mysqli($host, $username, $passwd, $dbname); 
    } 
    public function __get($property){ 
     return $this->realDb->$property; 
    } 

    public function __set($property, $value){ 
     return $this->realDb->$property = $value; 
    } 

    public function __call($method, $args){ 
     return call_user_func_array(array($this->realDb, $method), $args); 
    } 

    // overload begin_transaction, commit and rollback 
    public function begin_transaction(){ 
     $this->transaction_count++; 
     if ($this->transaction_count == 1){ 
       $this->realDb->begin_transaction(); 
     } 
    } 
    public function commit(){ 
     $this->transaction_count--; 
     if($this->transaction_count == 0){ 
       $this->realDb->commit(); 
     } 
    } 

    public function rollback(){ 
     throw new Exception("Error"); 
    } 
+0

감사합니다. 저는 OOP에별로 좋지 않지만 거래를 시작하는 방법은 무엇입니까? 그리고이 MySQL을 만들 수 있습니까? (추가 단계에서 MySQLi/PDO로 전체 웹 사이트를 업데이트합니다) – Jordy

+0

지금 업그레이드하는 것이 좋습니다. 하지만 개념은 처음으로 트랜잭션을 시작하고 변수를 증가시키고, 커밋 할 때 변수를 감소시키고, 커밋을 0으로하는 경우입니다. – Orangepill

+0

에 대한 검색을 'mysql에서 중첩 된 트랜잭션을 에뮬레이트합니다.' – Orangepill

관련 문제