Heim > Backend-Entwicklung > PHP-Tutorial > Yii2-Entwicklung: So kapseln Sie Transaktionen auf eine abschlussähnliche Weise

Yii2-Entwicklung: So kapseln Sie Transaktionen auf eine abschlussähnliche Weise

不言
Freigeben: 2023-04-03 18:44:01
Original
1427 Leute haben es durchsucht

Der Inhalt dieses Artikels befasst sich mit der Entwicklung von Yii2: Wie man Transaktionen auf eine abschlussähnliche Weise kapselt. Ich hoffe, dass er für Sie hilfreich ist.

Beim Ausführen einer Transaktion im Controller lautet der allgemeine Code wie folgt:

$transaction = Yii::$app->db->beginTransaction();
try {
    //一些业务代码
    $transaction->commit();
} catch (\Exception $e) {
    $transaction->rollBack();
    throw $e;
}
Nach dem Login kopieren

Also dachte ich, diese Codestruktur ist nur // Einige Geschäftscodes sind anders, aber das muss so sein Oftmals wiederholt werden, ist das nicht überflüssig? Und nein! Gut! sehen! Daher habe ich zunächst versucht, eine ähnliche Frage zum Stackflow zu finden. Es gibt jedoch eine Lösung, die dabei auftritt, z. B. verschachtelte Transaktionen Klicken Sie hier, um die Fragen und Antworten anzuzeigen.

Unser Yii-Framework bietet eine Methodentransaktion. Auf den ersten Blick scheint es, dass es das Problem der Parameterübergabe nicht lösen kann. Wenn wir nach unten schauen, heißt die Methode wie folgt:

rreee

Wir werfen einen Blick auf den Quellcode dieser Methode

Yii::$app->db->transaction(function() {
    //一些业务代码
});
Nach dem Login kopieren

Diese Methode akzeptiert eine Rückruffunktion und die Isolationsstufe der Transaktion
Von hier aus können wir sehen, dass diese Methode zwar Duplikate löst Code, es gibt noch einige Probleme, die ungelöst sind:
Zuerst müssen wir die von dieser Methode ausgelöste Ausnahme außerhalb des Empfangs behandeln. Wir können sie nicht direkt auslösen, was für den Client sehr unfreundlich ist.
Zweitens: Ohne Protokollierung ist es nicht einfach, ein Problem zu beheben, selbst wenn es auftritt.
Drittens: Tatsächlich ist es immer noch die erste Frage. Wenn wir jede Ausnahme behandeln und eine Schicht von try...catch... außerhalb der Transaktionsmethode verschachteln müssen, dann scheint es nicht anders zu sein, als wenn wir nicht kapseln Es?

Nach dem Prinzip, dass Methoden erweitert, aber nicht geändert werden können, sollten wir diese Methode in unserer eigenen öffentlichen Methode überladen. Der Überladungscode lautet wie folgt:

/**
 * Executes callback provided in a transaction.
 *
 * @param callable $callback a valid PHP callback that performs the job. Accepts connection instance as parameter.
 * @param string|null $isolationLevel The isolation level to use for this transaction.
 * See [[Transaction::begin()]] for details.
 * @throws \Exception|\Throwable if there is any exception during query. In this case the transaction will be rolled back.
 * @return mixed result of callback function
 */
public function transaction(callable $callback, $isolationLevel = null)
{
    $transaction = $this->beginTransaction($isolationLevel);
    $level = $transaction->level;

    try {
        $result = call_user_func($callback, $this);
        if ($transaction->isActive && $transaction->level === $level) {
            $transaction->commit();
        }
    } catch (\Exception $e) {
        $this->rollbackTransactionOnLevel($transaction, $level);
        throw $e;
    } catch (\Throwable $e) {
        $this->rollbackTransactionOnLevel($transaction, $level);
        throw $e;
    }

    return $result;
}
Nach dem Login kopieren

Dann zurück zur Frage So übergeben Sie Parameter: Wir können Abschlüsse verwenden und einen Teil des Pseudocodes wie folgt veröffentlichen:

public static function TransactionExecute(callable $function,$level=null)
{
    try{
        \Yii::$app->db->transaction($function,$level);
}catch (\Exception $e){
        //记录日志
        \Yii::error($e->getMessage());
        //这里可以理解成抛出自定义的异常类。
        (new self())->returnWayTip(1004, 'trans异常错误');
    }
}
Nach dem Login kopieren

Verwandte Empfehlungen:

Was sind die Systemeinstellungen in PHP? Zusammenfassung häufig verwendeter Systemeinstellungen in PHP (mit Code)

Wie generiert PHP JSON? PHP-Methodencode zum Generieren von JSON

Das obige ist der detaillierte Inhalt vonYii2-Entwicklung: So kapseln Sie Transaktionen auf eine abschlussähnliche Weise. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage