2017-01-30 8 views
8

मैं वर्तमान में दो तरीकों के लिए जो मैं एक साथ फोनबोतल आवेदन एक ही बात लौटने प्राप्त दो बार

किसी कारण से (जावा में HTTP के माध्यम से), एक उदाहरण है, जिसमें getAcc() एक ही खाते की जानकारी देता है दो बार होती है ? मुझे समझ में नहीं आता कि यह क्यों है।

मुझे लगता है कि यह संभव है कि getlogUse() को कॉल करने से पहले get_account का दूसरा कॉल हो रहा है (और इसलिए IN_USE चर 1 तक सेट नहीं है)। क्या कोई जानता है कि इसे कैसे ठीक करें? मैंने वेब पर कुछ पढ़ा है, और मेरा मानना ​​है कि यह शब्द सीरियलाइजेशन है। मैंने इसे ज्यादातर डेटाबेस के बारे में देखा है, लेकिन विधि को "लॉक" करने के बारे में लगभग कोई संदर्भ नहीं देखा है। मैं एक ताला बना सकता हूं और "लॉक के साथ" कर सकता हूं, लेकिन मैंने सुना है कि जाने का रास्ता नहीं है।

@app.route('/getAcc') 
def get_account(): 
    try: 
     cursor.execute("SELECT USER,PASS FROM ACCOUNTS WHERE TUT_DONE = 0 AND IN_USE = 0 LIMIT 1;") 
     return jsonify(data=cursor.fetchall()) 
    except (AttributeError, MySQLdb.OperationalError): 
     open_db() 
     return get_account() 


@app.route('/toggleUse', methods=['POST']) 
def toggle_use(): 
    try: 
     username = request.values['username'] 
     update_stmt = (
      "UPDATE ACCOUNTS SET IN_USE = !IN_USE WHERE USER = (%s)" 
     ) 
     data = (username,) 
     cursor.execute(update_stmt,data) 
     db.commit() 
     return 'Account ' + str(username) + ' IN_USE toggled' 

    except (AttributeError, MySQLdb.OperationalError): 
     open_db() 
     return toggle_use() 
+0

मुझे केल्विन के समान लगता है, यह जांचें कि get_account() के भीतर अपवाद स्वयं को बुला रहा है। मैं आपको एक डीबगर का उपयोग करने का सुझाव देता हूं, PyCharm एक अच्छा आईडीई है जो डीबग मोड में कैलकुलेटर प्रदान करता है। आप सामुदायिक संस्करण (मुफ्त) डाउनलोड कर सकते हैं। साथ ही, MySQL में SQL कोड चलाएं यह देखने के लिए कि यह कितनी लाइनों की गणना कर रहा है। –

+0

आप किन तरीकों और किस क्रम में कॉल कर रहे हैं? – syntonym

उत्तर

4

मैं इसे परीक्षण करने के लिए है, लेकिन एक डाटाबेस कनेक्शन खोलने और खुद बुला छोड़कर संदेह है कि आप अपने साथ एक मुद्दा होगा।

क्या आपने एक कनेक्शन बनाने की कोशिश की है जो आपको एक पूल दे जो आप बस कॉल कर सकते हैं?

connection = pyodbc.connect(connection_string, autocommit=True) #I think you can set autocommit here. 

@app.route('/getAcc') 
def get_account(): 
    try: 
     cursor = connection.cursor() 
     cursor.execute("SELECT USER,PASS FROM ACCOUNTS WHERE TUT_DONE = 0 AND IN_USE = 0 LIMIT 1;") 
     return jsonify(data=cursor.fetchall()) 
    except (AttributeError, MySQLdb.OperationalError): 
     # Return a meaningful message 

अन्य फ़ंक्शन के लिए एक ही चीज़।

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