2014-07-21 3 views
0

MySQL 데이터베이스의 항목 목록을 업데이트하는 서버에서 실행중인 하나의 스크립트가 바탕 화면에서 실행중인 다른 스크립트에 의해 처리됩니다. 스크립트는 매 5 분마다 목록을 처리하는 루프에서 실행됩니다 (서버 측 스크립트도 5 분 주기로 실행됩니다). 첫 번째 루프에서 스크립트는 현재 목록 (기본 SELECT 작업)을 검색하고 두 번째주기에서는 동일한 버전 (업데이트되지 않음) 목록을 가져오고 세 번째 목록에서는 두 번째 단계에서 가져야 할 목록을 가져옵니다. 첫 번째 이후의 모든 패스에서 SELECT 연산은 이전 UPDATE 연산의 데이터를 반환합니다. 당신이 볼 수 있듯이이전 업데이트 결과가 Python3의 mysql select에서 반환되었습니다.

def mainFlow(): 
    activeList=[] 
    d=() 
    a=() 
    b=() 
    #cycleStart=datetime.datetime.now() 
    cur = DBSV.cursor(buffered=True) 
    cur.execute("SELECT list FROM active_list WHERE id=1") 
    d=cur.fetchone() 
    DBSV.commit() 
    a=d[0] 
    b=a[0] 
    activeList=ast.literal_eval(a) 
    print(activeList) 
    buyList=[] 

    clearOrders() 
    sellDecide()  
    if activeList: 
     for i in activeList: 
      a=buyCalculate(i) 
      if a: 
       buyList.append(i) 
     print ('buy list: ',buyList)  
    if buyList: 
     buyDecide(buyList) 
    cur.close() 
    d=() 
    a=() 
    b=() 
    activeList=[] 

    print ('+++++++++++++END OF BLOCK+++++++++++++++') 


state=True 
while state==True: 
    cycleStart=datetime.datetime.now() 
    mainFlow() 
    cycleEnd=datetime.datetime.now() 
    wait=300-(cycleEnd-cycleStart).total_seconds() 
    print ('wait=: ' +str(wait)) 
    if wait>0: 
     time.sleep(wait) 

, 내 모든 변수를 초기화 재 오전, 난 일반 커서를 시도했다, 나는 문제의이 종류를 해결하기 위해 예상되는 커밋() 작업을하고있는 중이 야, 내 커서를 폐쇄하고 버퍼가 True 및 False로 설정된 커서는 항상 동일한 결과를 나타냅니다.

MySQL Workbench에서 정확히 동일한 Select 쿼리를 실행할 때 반환되는 결과는 문제가 없습니다.

방해 받고 2 일 동안 붙어 있습니다.

답변

1

당신이 수행하고 당신의 SELECT 문은 이론적으로, 비록 당신의 UPDATE/INSERT가/DML을 거래

삭제가 INSERT, UPDATE와 어떤 차이를 가지고 있으며,이 데이터를 수정하지 않습니다에서 삭제하기 전에 COMMIT 데이터베이스 내에서. 다른 세션에서 변경된 데이터를 보려면 변경된 후에 만 ​​을 COMMIT해야합니다. 이것은 각 루프 이후에 커서를 닫음으로써 부분적으로 악화됩니다.

이 문제를 해결하기에는 너무 거리가 멀었습니다. mainFlow() 방법 내에서 모든 것을 다시 할 필요가 (내가 대부분의 변수에 대한 필요성을 볼 수 없습니다)

def mainFlow(): 

    buyList = [] 

    cur = DBSV.cursor(buffered=True) 
    cur.execute("SELECT list FROM active_list WHERE id = 1") 

    activeList = cur.fetchone()[0] 
    activeList = ast.literal_eval(activeList) 

    clearOrders() 
    sellDecide()  

    for i in activeList: 
     a = buyCalculate(i) 
     if a: 
      buyList.append(i) 

    if buyList: 
     buyDecide(buyList) 

    DBSV.commit() 
    cur.close() 

while True: 

    cycleStart = datetime.datetime.now() 
    mainFlow() 
    cycleEnd = datetime.datetime.now() 

    wait = 300 - (cycleEnd - cycleStart).total_seconds() 

    if wait > 0: 
     time.sleep(wait) 

나는 불필요한 코드 (및 추가 공간)의 상당량을 제거했습니다, 나는 '없다 다른 것들에 대한 변수 이름의 재사용과 즉시 덮어 쓰기되는 변수의 선언을 제거했습니다. 그래도 여전히 OO가 아닙니다.

clearOrders(), sellDecide()buyCalculate()에 대한 자세한 지식이 없으므로 직접 확인해보십시오.

+0

놀라운. 나는 close()와 commit()이 어디에 위치 하는지를 어떻게 바꾸 었는지 반환 된 결과를 변경하는 방법을 여전히 완전히 이해하지 못하고 있지만, 작동한다. – sbeaudin

+0

거래를 커밋하면 변경 사항이 데이터베이스에 게시됩니다. 첫 번째주기에는 변경 사항을 게시하지 않고 두 번째에는 변경 사항을 게시하고 첫 번째와 세 번째에는 게시 한 변경 사항을 처음에 선택합니다 (또는 이와 비슷한 내용). – Ben

관련 문제