serialize()
समारोह के अंदर प्रत्येक आदेश समाप्त करने के लिए गारंटी है निष्पादित करने से पहले अगले एक शुरू होता है।
आपके उदाहरण में, CREATE TABLE
INSERT
से पहले समाप्त हो जाएगा। यदि आपने serialize()
का उपयोग नहीं किया है तो CREATE TABLE
और INSERT
कथन समानांतर में चलाए जाएंगे। वे दूसरे के बाद इतनी जल्दी शुरू हो जाएंगे कि INSERT
वास्तव में तालिका बनने से पहले समाप्त हो सकता है, जिससे आप उस तालिका में डेटा डालने का प्रयास करने में त्रुटि दे सकते हैं जो मौजूद नहीं है।
इसे दौड़ की स्थिति कहा जाता है, क्योंकि हर बार जब आप अपना प्रोग्राम चलाते हैं तो आपको एक अलग विजेता मिल सकता है। यदि CREATE TABLE
दौड़ जीतता है तो कार्यक्रम ठीक काम करेगा। लेकिन अगर INSERT
दौड़ जीतता है, तो प्रोग्राम एक त्रुटि के साथ टूट जाएगा। चूंकि आप दौड़ को जीतने वाले व्यक्ति को नियंत्रित नहीं कर सकते हैं, serialize()
INSERT
को CREATE TABLE
तक शुरू होने से भी अंत तक पहुंच जाएगा, यह सुनिश्चित करने के लिए कि आप हर बार एक ही परिणाम प्राप्त करें।
आपके दूसरे उदाहरण में केवल एक कथन के साथ serialize()
अभी भी आवश्यक है। ऐसा इसलिए है क्योंकि run()
SQL क्वेरी प्रारंभ करता है लेकिन पृष्ठभूमि में चलाने के लिए क्वेरी को छोड़कर, तुरंत देता है। चूंकि आपका बहुत ही कमांड एक close()
डेटाबेस है, इसलिए क्वेरी अभी भी चल रही है, तो आप इसे काट देंगे।
चूंकि serialize()
तब तक वापस नहीं आता है जब तक कि इसके आंतरिक प्रश्नों को पूरा नहीं किया जाता है, इसका उपयोग करके क्वेरी को पूरा होने तक close()
बंद कर दिया जाएगा।
यदि आप एक अलग प्रकार की क्वेरी का उपयोग कर रहे थे (किसी वेब पेज पर एक बटन पर क्लिक करने वाले उपयोगकर्ता के जवाब में कहें, जहां डेटाबेस कॉल के बीच खुला रहता है) तो आपको शायद serialize()
की आवश्यकता नहीं होगी। यह केवल इस बात पर निर्भर करता है कि प्रत्येक क्वेरी का पालन करने वाले कोड की आवश्यकता है कि इससे पहले पूछे जाने वाले प्रश्न या नहीं।
यह तय करते समय कि serialize()
का उपयोग करना है या नहीं, यह किसी भी गैर-धारावाहिक प्रश्नों के बारे में सोचने में सहायक हो सकता है जैसे कि उन्हें टिप्पणी की जाती है, और फिर देखें कि कोड अभी भी काम करेगा या नहीं। उपरोक्त आपके पहले उदाहरण में, CREATE TABLE
कमांड को हटाने से निम्नलिखित INSERT
कथन (क्योंकि तब सम्मिलित करने के लिए कोई तालिका नहीं होगी) तोड़ जाएगी, इसलिए इन्हें क्रमबद्ध करने की आवश्यकता है। लेकिन अगर आपके पास दो CREATE TABLE
कमांड थे तो एक को हटाने से दूसरे को प्रभावित नहीं होगा, इसलिए उन दो आदेशों को क्रमबद्ध नहीं किया जाना चाहिए।
(यह टिप close()
तथापि पर लागू नहीं होता - अंगूठे का नियम वहाँ केवल close()
कॉल करने के लिए एक बार सब कुछ चलना समाप्त कर दिया।)
शायद
कारणों में से एक: http://stackoverflow.com/ए/188 99872/1 9 3631 9 – Sizzler