2013-05-08 4 views
2

두 개의 데이터 저장소가 있다고 가정 해 봅시다 : MySQL (innodb) & Redis. 두 저장소에 데이터를 쓰고 트랜잭션에서 수행해야합니다. 일부 오류가 $Mysql->commit()에 occures 경우두 개 이상의 서로 다른 데이터 저장소에 쓸 때의 트랜잭션

try { 
    $Mysql->transaction(); //start mysql transaction 
    $Mysql->somecommands(); //exec some sql 
    $Redis->multi();   //start redis transaction 
    $Redis->somecommands(); //exec some redis commands 
    $Redis->exec()   //redis commit 
    $Mysql->commit();  //mysql commit 
} catch (Exception $e) { 
    $Mysql->rollback();  //mysql rollback 
    $Redis->discard();  //redis rollback 
} 

우리는 이미 레디 스하고 롤백 할 수없는 우리의 데이터를 가지고있다. 모범 사례는 무엇입니까?

답변

2

5.0.3 및 최대 XA를 지원하지만 레디 스하지 않습니다, 그래서 당신은 두 개의 참여자가 PREPARE, COMMITROLLBACK 의미를 이해하는 전통적인 의미에서 분산 트랜잭션을 수행 할 수 없습니다.

귀하의 경우, XA 비준수 참가자 (redis)가 1 명 밖에 없으므로 마지막으로 redis 작업을 수행하십시오. redis 작업이 성공하면 MySQL을 커밋합니다. redisation이 성공적이지 않으면, MySQL을 롤백하십시오. 따라서 모범 사례 측면에서 볼 때 선택의 여지가 거의 없으므로 올바른 방향으로 나아가고 있습니다. 당신은 redis에 대해 얼마나 많은 작업을하는지는 말하지 않았다. 단지 하나 일 뿐이라면 MULTI/EXEC과 함께 여러 번의 redis 작업을 수행하는 것이 실패하면, MySQL 을 롤백해야한다. MULTI/EXEC 이후 성공한 redis 작업은 원자 적이지 않습니다.

관련 문제