2013-05-08 24 views
2

假設我們有兩個數據存儲區:MySQL(innodb)& Redis。 我們需要將一些數據寫入兩個存儲並在事務中執行。寫入兩個或更多不同數據存儲區時的事務

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 
} 

如果某些錯誤的$Mysql->commit() occures我們已經有我們在Redis的,無法回滾它的數據。什麼是最佳實踐?

回答

2

的MySQL 5.0.3及以上版本支持XA,但Redis的沒有,所以傳統意義上的其中兩個參與者瞭解PREPARECOMMITROLLBACK語義不能執行分佈式事務。

對於您的情況,由於您只有1個不符合XA標準的參與者(redis),因此最後只需執行redis工作。如果redis操作成功,則提交MySQL。如果redis不成功,則回滾MySQL。所以就最佳實踐而言,由於您沒有其他選擇,因此您處於正確的軌道。你沒有說你對Redis做了多少操作,如果它只有一個,你沒問題,但是如果你使用MULTI/EXEC做了多次redis操作,並且某些操作失敗了,你需要回滾MySQL 撤消自MULTI/EXEC以來成功的redis操作不是原子操作。

相關問題