php - पीएचपी, MySQL, पीडीओ लेनदेन-क्या अंदर कोड को रोकने के लिए ब्लॉक की कोशिश करें?




pdo transactions (2)

मैं लेनदेन के लिए बहुत नया हूँ

इससे पहले, जो कुछ मैं कर रहा था वह ऐसा था:

कोड ब्लॉक 1

$db = new PDO(...);

$stmt = $db->prepare(...);

if($stmt->execute()){
    // success
    return true;
}else{
    // failed
    return false;
}

लेकिन एक ही लेन-देन में एकाधिक प्रश्नों को समूहित करने की कोशिश में, मैं अब कुछ ऐसा प्रयोग कर रहा हूं:

कोड ब्लॉक 2

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$db->beginTransaction();

try{
    $stmt = $db->prepare(... 1 ...);
    $stmt->execute();

    $stmt = $db->prepare(... 2 ...);
    $stmt->execute();

    $stmt = $db->prepare(... 3 ...);
    $stmt->execute();

    $db->commit();

    return true;
}catch(Exception $e){
    // Failed, maybe write the error to a txt file or something
    $db->rollBack();
    return false;
}

मेरा सवाल है: अगर लेनदेन किसी भी कारण से असफल हो जाता है, तो $db->commit(); पर कोड रोकता है $db->commit(); और catch ब्लॉक करने के catch कूद? या return true; पहले भागो, और फिर यह catch कोशिश करेगा? 'अगर यह मामला है, तो मैं पहले ही लौटा चुका हूं, और इसलिए यह catch लिए नहीं जाता। और यह गलत मान वापस कर दिया होता।

क्या मुझे अभी भी कुछ शामिल करने की आवश्यकता है:

कोड ब्लॉक 3

if($stmt->commit()){
    return true;
}

या क्या यह कोड ब्लॉक 2 में लिखा है यह पर्याप्त है?


अगर आपको किसी भी त्रुटि का सामना करना पड़ता है तो आप ऐसा सभी लेन-देन रोलबैक करने के लिए कर सकते हैं

catch(Exception $e){
    $db->rollBack();
    // Failed, maybe write the error to a txt file or something
    return false;
}

एक अपवाद फेंका जाता है जब निष्पादन बंद कर दिया है।

पहली वापसी पर नहीं पहुंचेगा लेकिन कैच स्टेटमेंट निष्पादित किया जाएगा।

आप सीधे भी सीधे वापस कर सकते हैं:

$dbh->beginTransaction();
try {
    // insert/update query
    return $dbh->commit();
} catch (PDOException $e) {
     $dbh->rollBack();
     return false;
}




transactions