अपने पहले प्रश्न का उत्तर देने के लिए...
लेन-देन का उपयोग करते समय, जहां तक आपके कनेक्शन का संबंध है, आपके प्रश्नों को सामान्य रूप से निष्पादित किया जाता है। आप उन परिवर्तनों को सहेजना, या रोलबैक करना, सभी परिवर्तनों को पूर्ववत करना चुन सकते हैं। निम्नलिखित छद्म कोड पर विचार करें:
insert into number(Random_number) values (rand());
select Random_number from number where Number_id=Last_insert_id();
// पीएचपी
if($num < 1)
$this->db->query('rollback;'); // This number is too depressing.
else
$this->db->query('commit;'); // This number is just right.
उत्पन्न यादृच्छिक संख्या को प्रतिबद्ध करने से पहले पढ़ा जा सकता है ताकि यह सुनिश्चित हो सके कि यह सभी के देखने के लिए इसे सहेजने से पहले उपयुक्त है (उदाहरण के लिए पंक्ति को प्रतिबद्ध और अनलॉक करें)।
यदि PDO ड्राइवर काम नहीं कर रहा है, तो mysqli ड्राइवर का उपयोग करने पर विचार करें। यदि वह विकल्प नहीं है, तो आप हमेशा 'id के रूप में last_insert_id() का चयन करें;' क्वेरी का उपयोग कर सकते हैं। $this->db->insert_id() फ़ंक्शन के बजाय।
अपने दूसरे प्रश्न का उत्तर देने के लिए, यदि आप डेटा डाल रहे हैं या अपडेट कर रहे हैं जिसे अन्य मॉडल अपडेट कर रहे हैं या पढ़ रहे हैं, तो लेनदेन का उपयोग करना सुनिश्चित करें। उदाहरण के लिए, यदि कोई कॉलम 'Number_remaining' 1 पर सेट है, तो निम्न समस्या हो सकती है।
Person A reads 1
Person B reads 1
Person A wins $1000!
Person A updates 1 to be 0
Person B wins $1000!
Person B updates 0 to be 0
एक ही स्थिति में लेन-देन का उपयोग करने से यह परिणाम प्राप्त होगा:
आप लेन-देन अलगाव स्तरों साथ ही।
गतिरोध से सावधान रहें, जो इस मामले में हो सकता है:
अंत में, चूंकि व्यक्ति बी शायद PHP के max_execution_time
. तक पहुंच गया है , वर्तमान क्वेरी PHP से स्वतंत्र रूप से निष्पादित करना समाप्त कर देगी, लेकिन कोई और प्रश्न प्राप्त नहीं होगा। यदि यह ऑटोकॉमिट =0 के साथ एक लेनदेन था, तो आपके PHP सर्वर से कनेक्शन विच्छेद होने पर क्वेरी स्वचालित रूप से रोलबैक हो जाएगी।