d_id=InsertMain(message.chat.id,text) bot.send_message(message.chat.id,config.SuccesAppend) c_id=message.chat.id thread_ = threading.Thread(target=Select,args=[c_id,d_id]) thread_.setDaemon(True) thread_.setName=str(c_id) thread_.start()
def Select(mId,d_id): while True: Wait=randint(0,1) WaitInput = randint(20,30) time.sleep(1) lock.acquire() try: result=conn.SelectMainAndID(d_id) finally: lock.release() if result: for value in result: . else: #bot.send_message(mId,config.NoLink) logging.error('BD Error'+str(id_)) continue
Вопрос почему при многопоточных запросах result=Null, при том что в базе есть что возвращать, а все остальные запросы типа INSERT,UPDATE,DELETE выполняются без проблем.
Код соединения и запроса:
class Base: def SelectMain(self,mId): try: self.db = MySQLdb.connect(host="localhost", user="test", passwd="password", db="testdb", charset='utf8') self.cursor = self.db.cursor() sql ="SELECT * FROM main WHERE M_ID ='%s' FOR UPDATE "% (mId) self.cursor.execute(sql) data = self.cursor.fetchall() return data except Exception: print ''.join(traceback.format_exception(*sys.exc_info())) return False def SelectMainAndID(self,mId): try: self.db = MySQLdb.connect(host="localhost", user="test", passwd="password", db="testdb", charset='utf8') self.cursor = self.db.cursor() sql ="SELECT * FROM main WHERE id ='%s' FOR UPDATE"% (mId) self.cursor.execute(sql) data = self.cursor.fetchall() self.db.close() return data except: return False def DeleteMain(self,ID): try: self.db = MySQLdb.connect(host="localhost", user="test", passwd="password", db="testdb", charset='utf8') self.cursor = self.db.cursor() sql = "DELETE FROM `main` WHERE id = '%s'" % (ID) self.cursor.execute(sql) self.db.commit() self.db.close() return True except: return False def UpdateMain(self,flag,url,mId): try: self.db = MySQLdb.connect(host="localhost", user="test", passwd="password", db="testdb", charset='utf8') self.cursor = self.db.cursor() self.cursor.execute("""UPDATE main SET CheckUrl=%s,StartUrl=%s WHERE id=%s""",(flag,url,mId)) self.db.commit() self.db.close() return True except: return False