2009-11-21 11 views
6

मैं लेनदेन की तरह चालान में हेरफेर करने के लिए एक इंटरफ़ेस बनाना चाहता हूं।कई PHP अनुरोधों में MySQL लेनदेन

डेटाबेस में एक चालान तालिका होती है, जिसमें बिलिंग जानकारी होती है, और एक चालान_लाइन तालिका होती है, जिसमें चालान के लिए लाइन आइटम होते हैं। वेबसाइट स्क्रिप्ट का एक सेट है जो चालानों और उनके संबंधित लाइनों को जोड़ने, संशोधन और हटाने की अनुमति देती है।

मेरी समस्या यह है कि, मैं वेब अनुप्रयोग में डेटाबेस के एसीआईडी ​​गुणों को प्रतिबिंबित करना चाहता हूं।

  • परमाणु: उपयोगकर्ता बचाने के हिट करते हैं, या तो पूरा चालान संशोधित किया गया है या पूरे चालान बिल्कुल नहीं बदली है।
  • संगत: एप्लिकेशन कोड पहले से ही स्थिरता सुनिश्चित करता है, लाइनों को मौजूद मौजूदा चालान में जोड़ा नहीं जा सकता है। चालान आईडी को डुप्लिकेट नहीं किया जा सकता है।
  • पृथक: यदि कोई उपयोगकर्ता किसी चालान में परिवर्तनों के सेट के बीच में है, तो मैं उपयोगकर्ता को सहेजने तक अन्य उपयोगकर्ताओं से उन परिवर्तनों को छिपाना चाहता हूं।
  • टिकाऊ: यदि वेबसाइट मर जाती है, तो डेटा सुरक्षित होना चाहिए। यह पहले से ही काम करता है।

यदि मैं डेस्कटॉप एप्लिकेशन लिख रहा था, तो यह हर समय MySQL डेटाबेस से कनेक्शन बनाए रखेगा, जिससे मुझे संपादन और शुरुआत के अंत में BEGIN ट्रांज़ेक्शन और COMMIT का उपयोग करने की अनुमति मिल जाएगी।

जो मैं समझता हूं उससे आप एक PHP पृष्ठ पर ट्रांसफर नहीं कर सकते हैं और एक अलग पृष्ठ पर COMMIT कर सकते हैं क्योंकि कनेक्शन पृष्ठों के बीच बंद है।

क्या एक्सटेंशन के बिना इसे संभव बनाने का कोई तरीका है? जो मैंने पाया है, केवल SQL Relay यह करता है (लेकिन यह एक एक्सटेंशन है)।

उत्तर

6

आप लंबे समय तक चलने वाले लेनदेन नहीं करना चाहते हैं, क्योंकि यह समवर्ती सीमा को सीमित कर देगा। http://en.wikipedia.org/wiki/Command_pattern

1

समाधान जीईटी चरण के दौरान लेनदेन को खोलना नहीं है। "सहेजने" बटन द्वारा ट्रिगर किए गए POST के दौरान लेन-देन के सभी पहलुओं- BEGIN ट्रांज़ेक्शन, प्रोसेसिंग और COMMIT-सब करें।

+0

इस विचार के साथ समस्या यह है कि कोई अन्य उपयोगकर्ता मेरे अंतर्गत डेटा संपादित कर सकता है। प्रत्येक चालान में परिवर्तनों को ट्रैक करने के लिए इसके लिए अतिरिक्त कोड की आवश्यकता होती है (यानी, संशोधन संख्या)। मूल लेन-देन केवल एक प्रतिबद्ध संघर्ष फेंक देगा और मेरा आवेदन उपयोगकर्ता को उस पर पुनर्स्थापित कर सकता है। – Martin

+1

@ मार्टिन: समवर्ती मुद्दों से निपटने के लिए, तालिका में एक संस्करण कॉलम जोड़ें ताकि रिकॉर्ड को अपडेट/हटाया न जा सके जब तक कि संस्करण मान वर्तमान में संपादित नहीं हो रहा है और वर्तमान में डीबी क्या संग्रहीत कर रहा है। –

+1

उस स्थिति में आपको किसी अन्य उपयोगकर्ता को ऐसा करने से रोकने के लिए निराशावादी या आशावादी लॉकिंग तंत्र बनाना होगा। अन्य उपयोगकर्ताओं को पदानुक्रमित करना, पदानुक्रम के एक हिस्से से एक कुंजी के आधार पर जहां आप अवरुद्ध करना चाहते हैं - या आशावादी (यह मानते हुए कि यह अक्सर नहीं होगा) उन्हें अपने डेटा को दोबारा दर्ज करने के लिए कहकर। –

2

डेटाबेस लेनदेन वास्तव में इस उद्देश्य के लिए नहीं हैं - यदि आपने उनका उपयोग किया है, तो आप शायद अन्य समस्याओं में भाग लेंगे।

लेकिन आप उनका उपयोग भी नहीं कर सकते क्योंकि प्रत्येक पृष्ठ अनुरोध अपने कनेक्शन (संभावित रूप से) का उपयोग करता है, इसलिए किसी अन्य के साथ लेनदेन साझा नहीं कर सकता है।

उपयोगकर्ता को संपादित करने के दौरान कहीं और चालान में संशोधन रखें, फिर उन्हें सहेजते समय लागू करें; आप इस अंतिम लागू लेनदेन में कदम लागू कर सकते हैं (यद्यपि काफी अल्पकालिक एक)।

लंबे समय तक रहने वाले लेन-देन आमतौर पर खराब होते हैं।

0

लगातार कनेक्शन आप मदद कर सकते हैं: http://php.net/manual/en/features.persistent-connections.php

एक और है कि जब लेनदेन का उपयोग कर, एक सौदे ब्लॉक भी खत्म हो गया अगले स्क्रिप्ट जो का उपयोग करता है कनेक्शन स्क्रिप्ट क्रियान्वयन से पहले समाप्त हो जाती है, तो करने के लिए ले जाएगा लेनदेन ब्लॉक करता है।

लेकिन मैं आपको समस्या के लिए एक और दृष्टिकोण खोजने की सलाह देता हूं। उदाहरण के लिए: कैश तालिका बनाएं। जब आपको "प्रतिबद्ध" करने की आवश्यकता होती है, तो कैश तालिका से रिकॉर्ड को "वास्तविक" तालिका में स्थानांतरित करें।

4

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

आप अलग अलग आर्किटेक्चर को यहां ज्यादा सलाह मिल जाएगा, लेकिन मैं कह सकता हूँ कि Zend फ्रेमवर्क (http://framework.zend.com) और सिद्धांत के उपयोग (http://www.doctrine-project.org/) इस परी आसान बनाने के बाद से Zend MVC वास्तुकला और सत्र प्रबंधन और सिद्धांत के बहुत प्रदान करता है मूल CRUD (बनाएं, पुनर्प्राप्त करें, अपडेट करें, हटाएं) जो आप ढूंढ रहे हैं - साथ ही अन्य सभी पहलुओं (विशिष्टता, प्रतिबद्धता, रोलबैक इत्यादि) प्रदान करते हैं। Mysql के लिए कनेक्शन को चालू रखने से टाइमआउट और उपलब्ध कनेक्शन की कमी हो सकती है।

0

Altough कुछ अच्छे उत्तर हैं, मुझे लगता है कि आपके प्रश्न के कुछ अच्छे जवाब मिले, कि मैं भी साथ अटक गया था। मुझे लगता है कि सबसे अच्छा तरीका डॉक्टरेट (ओ/आर मैपिंग) जैसे ढांचे का उपयोग कर रहा है जिसमें किसी तरह का दृष्टिकोण लागू किया गया है। Here आपके पास एक लिंक है जिसके बारे में मैं बात कर रहा हूं।

संबंधित मुद्दे