Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

वेब एप्लिकेशन में एक साथ लेनदेन को रोकें

मुझे खुशी है कि आपने महसूस किया कि यह केवल एक खराब और अस्थायी समाधान है और आपको अपना कोड अनुकूलित करना चाहिए। अपने टोकन और सामान को भूल जाओ। सबसे आसान और अभी भी कुशल तरीका शायद प्रति ऑपरेशन एक साझा फ़ाइल पर एक विशेष फ़ाइल लॉक होना है। आप इसकी कल्पना लकड़ी के टुकड़े की तरह कर सकते हैं और केवल एक ही आईडी पकड़ सकता है और केवल जिसके पास है उसे ही बात करने या कुछ करने की अनुमति है।

<?php
    $fp = fopen("/tmp/only-one-bed-available.txt", "w+");

    if (flock($fp, LOCK_EX)) { // do an exclusive lock

         // do some very important critical stuff here which must not be interrupted:
         // sleeping.
         sleep(60);
         echo "I now slept 60 seconds";
        flock($fp, LOCK_UN); // release the lock
    } else {
        echo "Couldn't get the lock!";
    }

    fclose($fp);
?>

यदि आप इस स्क्रिप्ट को समानांतर में 10 बार निष्पादित करते हैं, तो इसे समाप्त होने में 10 मिनट का समय लगेगा (क्योंकि केवल एक बिस्तर उपलब्ध है!)>

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

<?php $fp = fopen("/tmp/lock-".$_SERVER["REMOTE_ADDR"].".txt", "w+"); ?>

आप संचालन के समूह के लिए लॉक फ़ाइल नाम भी परिभाषित कर सकते हैं। मैबी उपयोगकर्ता कुछ सामान समानांतर कर सकता है लेकिन केवल यह ऑपरेशन ही समस्या पैदा करता है? इसे एक टैग दें और इसे लॉक फ़ाइलनाम में शामिल करें!

यह अभ्यास वास्तव में उतना बुरा नहीं है और इसका उपयोग किया जा सकता है! इसे तेजी से करने के बहुत कम तरीके हैं (mysql इंटर्नल, साझा मेमोरी सेगमेंट, लोड बैलेंसर जैसी उच्च परत पर क्रमांकन...)

ऊपर पोस्ट किए गए समाधान के साथ आप इसे अपने आवेदन में कर सकते हैं जो शायद अच्छा है। आप उसी योजना का उपयोग मैसकल में भी कर सकते हैं:http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_get-lock

लेकिन आपके उपयोग के मामले में PHP कार्यान्वयन शायद आसान और बेहतर है।

यदि आप वास्तव में एक और अधिक सुरुचिपूर्ण समाधान चाहते हैं, तो बस इस फ़ंक्शन को देखें http://www.php.net/manual/en/function.sem-get.php



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या मैं वाईआई को जेनरेट किए गए एसक्यूएल में विशेष उपनाम का उपयोग करने के लिए मजबूर कर सकता हूं

  2. MySQL का उपयोग करके बाइनरी को दशमलव में बदलें

  3. वर्ष () उदाहरण – MySQL

  4. कैसे पता चलेगा कि MySQLnd सक्रिय ड्राइवर है?

  5. मैं लार्वा बैकपैक में IN क्लॉज कैसे निर्दिष्ट करूं?