जवाबों:
तुम यह केर सकते हो:
DB::transaction(function() {
//
});
बंद के अंदर सब कुछ एक लेनदेन के भीतर निष्पादित करता है। यदि कोई अपवाद होता है तो यह स्वचालित रूप से रोलबैक हो जाएगा।
Discussed in more detail here
लिंक मर चुका है।
यदि आपको अनाम कार्य पसंद नहीं हैं:
try {
DB::connection()->pdo->beginTransaction();
// database queries here
DB::connection()->pdo->commit();
} catch (\PDOException $e) {
// Woopsy
DB::connection()->pdo->rollBack();
}
अद्यतन : लार्वा 4 के लिए, pdo
वस्तु अब तक सार्वजनिक नहीं है:
try {
DB::beginTransaction();
// database queries here
DB::commit();
} catch (\PDOException $e) {
// Woopsy
DB::rollBack();
}
DB::beginTransaction()
& DB::commit()
& का भी उपयोग कर सकते हैं DB::rollback()
। यह थोड़ा क्लीनर होगा।
DB::connection()->getPdo()->beginTransaction();
DB::transaction
है कि कॉलबैक के साथ भी क्लीनर है, लेकिन दोष यह है कि यदि आपको अलग-अलग अपवादों के लिए अलग-अलग हैंडलर निर्दिष्ट करने की आवश्यकता है, तो आपको तकनीक / तकनीक पकड़ने के लिए वापस जाना होगा
अगर आप एलोक्वेंट का उपयोग करना चाहते हैं, तो आप इसका भी उपयोग कर सकते हैं
यह मेरी परियोजना से सिर्फ नमूना कोड है
/*
* Saving Question
*/
$question = new Question;
$questionCategory = new QuestionCategory;
/*
* Insert new record for question
*/
$question->title = $title;
$question->user_id = Auth::user()->user_id;
$question->description = $description;
$question->time_post = date('Y-m-d H:i:s');
if(Input::has('expiredtime'))
$question->expired_time = Input::get('expiredtime');
$questionCategory->category_id = $category;
$questionCategory->time_added = date('Y-m-d H:i:s');
DB::transaction(function() use ($question, $questionCategory) {
$question->save();
/*
* insert new record for question category
*/
$questionCategory->question_id = $question->id;
$questionCategory->save();
});
question->id
लेन-देन कॉलबैक पर अभिव्यक्ति शून्य देता है।
यदि आप बंद होने से बचना चाहते हैं, और facades का उपयोग करके खुश हैं, तो निम्नलिखित चीजें अच्छी और साफ रहती हैं:
try {
\DB::beginTransaction();
$user = \Auth::user();
$user->fill($request->all());
$user->push();
\DB::commit();
} catch (Throwable $e) {
\DB::rollback();
}
यदि कोई कथन विफल हो जाता है, तो प्रतिबद्ध कभी नहीं मारा जाएगा, और लेनदेन प्रक्रिया नहीं करेगा।
मुझे यकीन है कि आप एक बंद समाधान की तलाश नहीं कर रहे हैं, इसे अधिक कॉम्पैक्ट समाधान के लिए आज़माएं
try{
DB::beginTransaction();
/*
* Your DB code
* */
DB::commit();
}catch(\Exception $e){
DB::rollback();
}
किसी कारण से यह जानकारी कहीं भी मिलना काफी मुश्किल है, इसलिए मैंने इसे यहां पोस्ट करने का फैसला किया, जैसा कि मेरा मुद्दा, जबकि एलोकेंट लेनदेन से संबंधित, वास्तव में इसे बदल रहा था।
इस स्टैकओवरफ़्लो उत्तर को पढ़ने के बाद , मुझे एहसास हुआ कि मेरे डेटाबेस टेबल इनोबीडी के बजाय MyISAM का उपयोग कर रहे थे।
लेनवेल पर काम करने के लिए लेनदेन (या कहीं और जैसा लगता है), यह आवश्यक है कि आपकी तालिकाओं को InnoDB का उपयोग करने के लिए सेट किया गया हो
क्यों?
MySQL लेनदेन और परमाणु संचालन डॉक्स ( यहां ) उद्धृत करते हुए :
MySQL सर्वर (संस्करण 3.23-अधिकतम और सभी संस्करण 4.0 और ऊपर) InnoDB और BDB लेनदेन भंडारण इंजन के साथ लेनदेन का समर्थन करता है। InnoDB पूर्ण ACID अनुपालन प्रदान करता है। अध्याय 14, संग्रहण इंजन देखें। लेनदेन त्रुटियों के उपचार के संबंध में मानक SQL से InnoDB अंतर के बारे में जानकारी के लिए, अनुभाग 14.2.11, "InnoDB त्रुटि हैंडलिंग" देखें।
MySQL सर्वर (जैसे MyISAM) में अन्य nontransactional भंडारण इंजन "परमाणु संचालन" नामक डेटा अखंडता के लिए एक अलग प्रतिमान का पालन करते हैं। लेन-देन के संदर्भ में, MyISAM तालिकाओं को हमेशा ऑटोकॉमिट = 1 मोड में संचालित किया जाता है। परमाणु संचालन अक्सर उच्च प्रदर्शन के साथ तुलनीय अखंडता प्रदान करते हैं।
क्योंकि MySQL सर्वर दोनों प्रतिमानों का समर्थन करता है, आप यह तय कर सकते हैं कि क्या आपके अनुप्रयोग परमाणु संचालन की गति या ट्रांसेक्शनल सुविधाओं के उपयोग द्वारा सर्वोत्तम रूप से परोसे जाते हैं। यह चुनाव प्रति तालिका के आधार पर किया जा सकता है।
यदि कोई अपवाद होता है, तो लेनदेन स्वचालित रूप से रोलबैक होगा।
लारवेल बेसिक ट्रांजेक्शन फॉर्मेट
try{
DB::beginTransaction();
/*
* SQL operation one
* SQL operation two
..................
..................
* SQL operation n */
DB::commit();
/* Transaction successful. */
}catch(\Exception $e){
DB::rollback();
/* Transaction failed. */
}