आप इसका उपयोग तब करते हैं जब आपके पास SQL कथनों की एक श्रृंखला होती है जिसे आपके डेटाबेस में स्थिरता बनाए रखने के लिए एक साथ किया जाना चाहिए। एक गेम में सेव पॉइंट स्थापित करने के रूप में कॉल करने के बारे में सोचें। जब भी आप रोलबैक को कॉल करते हैं तो आप वह सब कुछ पूर्ववत कर देते हैं जो पिछली प्रतिबद्धता तक किया गया था।
ऐसी स्थिति की कल्पना करें जहां आपको अपनी चालान तालिका में चालान, अपनी चालान_विवरण तालिका में विवरण और अपनी भुगतान तालिका में भुगतान सहेजने की आवश्यकता हो। निरंतरता बनाए रखने के लिए आपको यह सुनिश्चित करने की आवश्यकता है कि ये सभी हो चुके हैं या इनमें से कोई भी नहीं किया गया है। यदि आप चालान और विवरण कहां जोड़ते हैं और फिर भुगतान डालने में विफलता होती है तो आपका डेटाबेस असंगत स्थिति में छोड़ दिया जाता है।
आम तौर पर यह इस तरह से एक कोशिश/पकड़ ब्लॉक का उपयोग करके पूरा किया जाता है:
try {
$dbconnect->autocommit(false);
$stmt = $dbconnect->prepare("INSERT INTO `invoices`(`col1`,`col2`) VALUES (?,?)");
$stmt->bind_param('ss',$val1,$val2);
$stmt->execute();
$stmt = $dbconnect->prepare("INSERT INTO `invoice_details`(`col1`,`col2`) VALUES (?,?)");
$stmt->bind_param('ss',$val3,$val4);
$stmt->execute();
$stmt = $dbconnect->prepare("INSERT INTO `payments`(`col1`,`col2`) VALUES (?,?)");
$stmt->bind_param('ss',$val5,$val6);
$stmt->execute();
$dbconnect->commit();
} catch(Exception $e){
// undo everything that was done in the try block in the case of a failure.
$dbconnect->rollback();
// throw another exception to inform the caller that the insert group failed.
throw new StorageException("I couldn't save the invoice");
}