php - तालाब mysql लेनदेन को समझना




pdo transactions (2)

आप php दस्तावेज़ीकरण में इसका जवाब नहीं ढूंढने जा रहे हैं क्योंकि इसका php या pdo से कोई लेना-देना नहीं है।

Mysql में इनोडब टेबल इंजन sql मानक के अनुरूप 4 तथाकथित अलगाव स्तर प्रदान करता है। अवरुद्ध / गैर-अवरुद्ध रीडिंग के साथ संयोजन में अलगाव स्तर उपरोक्त उदाहरण के परिणाम को निर्धारित करेगा। आपको विभिन्न अलगाव स्तरों के निहितार्थों को समझने और अपनी आवश्यकताओं के लिए उपयुक्त एक को चुनने की आवश्यकता है।

योग करने के लिए: यदि आप ऑटोकॉमिट के साथ क्रमिक आइसोलेशन स्तर का उपयोग करते हैं, तो परिणाम 12000 होगा। अन्य सभी आइसोलेशन स्तरों में और ऑटोकॉमिट के साथ क्रमिक सक्षम होने पर परिणाम 11000 होगा। यदि आप रीडिंग का उपयोग करना शुरू करते हैं, तो परिणाम हो सकता है। सभी अलगाव स्तरों के तहत 12000।

PHP प्रलेखन कहता है:

यदि आपने पहले कभी लेन-देन का सामना नहीं किया है, तो वे 4 प्रमुख विशेषताएं प्रदान करते हैं: एटोमिसिटी, संगति, अलगाव और स्थायित्व (एसीआईडी)। आम आदमी की शर्तों में, लेन-देन में किया गया कोई भी काम, भले ही वह चरणों में किया जाता है, को डेटाबेस में सुरक्षित रूप से लागू करने की गारंटी दी जाती है, और जब यह प्रतिबद्ध होता है, तो अन्य कनेक्शनों से हस्तक्षेप किए बिना।

सवाल:

क्या इसका मतलब यह है कि मैं दो अलग-अलग php स्क्रिप्ट को एक साथ लेन-देन के बिना एक साथ लेन-देन कर सकते हैं?

"इंटेरफ़ायरिंग " के द्वारा मुझे क्या पसंद है :

कल्पना करें कि हमारे पास निम्नलिखित employees तालिका है:

 __________________________
|  id  |  name  |  salary  |
|------+--------+----------|
|  1   |  ana   |   10000  |
|------+--------+----------|

यदि मेरे पास समान / समान कोड वाली दो स्क्रिप्ट हैं और वे ठीक उसी समय चलती हैं:

script1.php और script2.php (दोनों का कोड समान है):

$conn->beginTransaction();

$stmt = $conn->prepare("SELECT * FROM employees WHERE name = ?");
$stmt->execute(['ana']);
$row = $stmt->fetch(PDO::FETCH_ASSOC);

$salary = $row['salary'];
$salary = $salary + 1000;//increasing salary

$stmt = $conn->prepare("UPDATE employees SET salary = {$salary} WHERE name = ?");
$stmt->execute(['ana']);

$conn->commit(); 

और घटनाओं का क्रम इस प्रकार है:

  • script1.php डेटा का चयन करता है

  • script2.php डेटा का चयन करता है

  • script1.php डेटा अपडेट करता है

  • script2.php डेटा अपडेट करता है

  • script1.php कमिट () होता है

  • script2.php कमिट () होता है

इस मामले में एना का परिणामी वेतन क्या होगा?

  • क्या यह 11000 होगा? और क्या इसका मतलब यह होगा कि 1 लेन-देन दूसरे को ओवरलैप करेगा क्योंकि सूचना प्राप्त होने से पहले हुई थी?

  • क्या यह 12000 होगा? और क्या इसका मतलब यह होगा कि डेटा को अद्यतन और चयनित किए जाने के आदेश की परवाह किए बिना, commit() फ़ंक्शन ने व्यक्तिगत रूप से ऐसा करने के लिए मजबूर किया?

कृपया बेझिझक, जितना आप चाहते हैं कि लेन-देन और अलग-अलग स्क्रिप्ट एक-दूसरे के साथ हस्तक्षेप (या हस्तक्षेप न करें) कैसे करें।


काश, "हस्तक्षेप के बिना" प्रोग्रामर से कुछ मदद की आवश्यकता होती है। इसे 'लेन-देन' की सीमा को परिभाषित करने के लिए BEGIN और COMMIT आवश्यकता है। तथा...

आपका उदाहरण अपर्याप्त है। पहले स्टेटमेंट के लिए SELECT ... FOR UPDATE । यह लेनदेन प्रसंस्करण को बताता है कि पंक्ति (लों) के लिए एक UPDATE आने की संभावना है जो कि सेलेक्ट करता है। यह चेतावनी "हस्तक्षेप को रोकने" के लिए महत्वपूर्ण है। अब समयरेखा पढ़ता है:

  • script1.php BEGINs
  • script2.php BEGINs
  • script1.php डेटा का चयन करता है ( FOR UPDATE )
  • script2.php डेटा का चयन अवरुद्ध है, इसलिए यह प्रतीक्षा करता है
  • script1.php डेटा अपडेट करता है
  • script1.php कमिट () होता है
  • script2.php डेटा का चयन करता है (और नव-प्रतिबद्ध मूल्य प्राप्त करेगा)
  • script2.php डेटा अपडेट करता है
  • script2.php कमिट () होता है

(नोट: यह 'गतिरोध' नहीं है, बस एक 'प्रतीक्षा' है।)





transactions