私はこの Yii 用のNestedPDOソリューションが本当に気に入っていますが、別のトランザクション処理が必要です。
ネストされたすべてのトランザクションをコミットできる場合にのみ、ネストされたトランザクションをコミットしたいと思います。1 つのトランザクションがロールバックする場合は、すべてのトランザクションをロールバックする必要があります。
どうやってやるの?
機能しなかったロールバック機能を変更しようとした私の試み:
public function rollBack() {
$this->transLevel--;
if($this->transLevel == 0 || !$this->nestable()) {
parent::rollBack();
} else {
$level = $this->transLevel;
for($level; $level>1; $level--){
$this->exec("ROLLBACK TO SAVEPOINT LEVEL{$this->constantlevel}");
}
//parent::rollBack();
}
}
私は NestedPDO を適応させることを考えていました: 関数 commit() では、最も外側のトランザクションでのみコミットを行い、関数 rollBack() では、どのサブトランザクションがロールバックを引き起こしたかに関係なく、最も外側のトランザクションにロールバックを行います。でもやりきれなかった…。
私は MySQL と InnoDB テーブルを使用していますが、自動コミットについてはよくわかりませんが、トランザクション内で自動コミットの値をエコーするとき、常に値 1 を取得します。これは、自動コミットがオンであることを意味しますが、トランザクション内では自動コミットを 0 に設定する必要があります。これがロールバック全体が機能しない原因かどうかわかりませんか?