Microsoft MVP성태의 닷넷 이야기
오류 유형: 870. _mysql - Commands out of sync; you can't run this command now [링크 복사], [링크+제목 복사],
조회: 11315
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

_mysql - Commands out of sync; you can't run this command now

다음의 코드를 수행하면,

# MySQLdb._mysql
# https://mysqlclient.readthedocs.io/user_guide.html#some-mysql-examples

def mysqlclient_raw2(request):
    from MySQLdb import _mysql

    mysql_ip = util.get_mysql_ip()

    con = _mysql.connect(mysql_ip, "...", "...", "...")

    con.query("SELECT SLEEP(0)")
    con.commit()

    con.close()

    return render(request, 'bbs/mysqlclient_raw.html', {'result_set': None})

(필요없는 호출이긴 하지만) con.commit()에서 이런 예외가 발생합니다.

Traceback (most recent call last):
  File "/home/kevin/.local/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/home/kevin/.local/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/mnt/d/workshop2/python-agent/testprj/myapp/./bbs/views.py", line 346, in mysqlclient_raw
    con.commit()
MySQLdb.ProgrammingError: (2014, "Commands out of sync; you can't run this command now")

관련해서 검색해 보면,

B.3.2.12 Commands out of sync
; https://dev.mysql.com/doc/refman/8.0/en/commands-out-of-sync.html

This can happen, for example, if you are using mysql_use_result() and try to execute a new query before you have called mysql_free_result(). It can also happen if you try to execute two queries that return data without calling mysql_use_result() or mysql_store_result() in betwee


con.query("SELECT SLEEP(0)") 코드 수행으로 resultset이 열려 있게 되고, 그런 와중에 con.commit()으로 인해 수행되는 또 다른 MySql 쿼리로 인해 문제가 되는 것 같습니다.

따라서, 이 문제를 해결하려면 commit 전에 ("SELECT"를 동반한 쿼리인 경우라면) 반드시 store_result를 호출해야 합니다. (혹은, commit을 호출하지 않으면 됩니다.)

con = _mysql.connect(mysql_ip, "...", "...", "...")

con.query("SELECT SLEEP(0)")
con.store_result()
con.commit()

반면에 use_result를 쓰면,

con.query("SELECT SLEEP(0)")
r = con.use_result()
con.commit()  # 예외 발생: MySQLdb.ProgrammingError: (2014, "Commands out of sync; you can't run this command now")

다시 예외가 발생하는데, "B.3.2.12 Commands out of sync" 문서에서 설명했듯이 use_result/free_result를 쌍으로 호출해야 하지만 웬일인지 MySQLdb._mysql에는 해당 함수가 제공되지 않습니다. (MySQL측의 connector에는 free_result 함수가 제공됩니다.)

그렇다면 use_result와 store_result 간에는 어떤 차이점이 있을까요?

mysqli_store_result() vs. mysqli_use_result()
; https://stackoverflow.com/questions/9876730/mysqli-store-result-vs-mysqli-use-result

mysqli::store_result() will fetch the whole resultset from the MySQL server while mysqli::use_result() will fetch the rows one by one.


설명에 따르면 store_result의 경우 resultset을 전부 순회한 것이 되고, use_result의 경우에는 그렇지 않은 유형입니다. 따라서, 다음과 같이 직접 순회를 마치면,

con.query("SELECT SLEEP(0)")
r = con.use_result()
r.fetch_row()  # 2번을 호출
r.fetch_row()
con.commit()  # 정상 동작

또는, while 문으로 돌려주면,

con.query("SELECT SLEEP(0)")
r = con.use_result()

while r.fetch_row():
    pass

con.commit()  # 정상 동작

commit 호출 시 예외가 발생하지 않습니다. 참고로, 다른 의견을 보면 그 둘 간의 차이점에는 buffer가 관여한다고 합니다.

use_result returns an unbuffered result.
store_result returns a buffered result.

그렇다면 store_result의 경우에도 버퍼를 초과하는 select인 경우라면 문제가 된다는 것일까요? 딱히 버퍼의 용량을 알아내는 것도 없으니 테스트가 애매합니다.

정리해 보면, 결국 제가 _mysql의 사용법을 제대로 익히지 않았다고 볼 수 있습니다. ^^





[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 6/28/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 121  122  123  124  125  126  127  128  129  130  131  132  133  [134]  135  ...
NoWriterDateCnt.TitleFile(s)
1705정성태7/2/201435084VC++: 78. 보이어-무어(Boyer-Moore) 알고리즘이 정말 빠를까? [6]파일 다운로드1
1704정성태7/2/201421713.NET Framework: 447. w3wp.exe AppPool 재생(recycle)하는 방법 정리
1703정성태7/2/201422538.NET Framework: 446. Assembly.Load를 이용해 GAC에 등록된 어셈블리를 로드하는 방법 [1]파일 다운로드1
1702정성태6/23/201422315Phone: 11. Xamarin.Forms - 2. XAML을 이용한 페이지 개발파일 다운로드1
1701정성태6/23/201434484개발 환경 구성: 229. .NET Reflector + Reflexil 도구를 이용해 DLL 코드 변경 [4]
1700정성태6/23/201421309VS.NET IDE: 89. Visual Studio에서 기본 제공되는 성능 프로파일 [2]
1699정성태6/22/201424104Phone: 10. Xamarin.Forms - 1. Forms 시작하기 [2]파일 다운로드1
1698정성태6/22/201426070.NET Framework: 445. [부연 설명] 쉬운 C# 코드를 어럽게 이해하기 [2]
1697정성태6/22/201421375VS.NET IDE: 88. Visual Studio에서 직접 컴파일하는 IL 언어 확장 도구 - IL Support
1696정성태6/22/201421167.NET Framework: 444. clojure와 C#을 통해 이해하는 Sequence와 Vector 형식의 차이점 [1]
1695정성태6/21/201420199개발 환경 구성: 228. PowerShell ISE에서 (입력 기능이 있는) 콘솔 응용 프로그램을 시작하는 방법
1694정성태6/21/201421348개발 환경 구성: 227. 닷넷 용 ClojureCLR 개발환경 설정
1693정성태6/20/201421674개발 환경 구성: 226. Clojure 언어의 윈도우 개발환경 설정
1692정성태6/19/201432249오류 유형: 231. Visual Studio 2013 한글 버전 설치 오류 - The form specified for the subject is not one supported or known by the specified trust provider
1691정성태6/18/201427465개발 환경 구성: 225. 유닉스 계열의 tail 명령어가 제공되는 PowerShell [1]
1690정성태6/18/201430263개발 환경 구성: 224. DirectShow 예제 구하는 방법 [3]
1689정성태6/18/201427111오류 유형: 230. C++ 가변 인자 사용시 va_start 파라미터 전달 방법 [2]
1688정성태6/15/201420671오류 유형: 229. 갤럭시 노트 3 환경에서 Xamarin 앱 배포 충돌
1687정성태6/15/201426662개발 환경 구성: 223. PowerShell로 Visual Studio 빌드 스크립트 작성파일 다운로드1
1686정성태6/12/201424396Windows: 96. 윈도우 8 - 그림 암호를 이용해 로그인 시 지연 현상을 해결하는 방법 [1]
1685정성태6/10/201431129.NET Framework: 443. 자바 8과 C#의 람다(Lambda) 지원에 대한 비교 [12]
1684정성태6/9/201441295.NET Framework: 442. C# - 시스템의 CPU 사용량 및 프로세스(EXE)의 CPU 사용량 알아내는 방법 [5]파일 다운로드1
1683정성태6/2/201420870오류 유형: 228. CLR4 보안 - yield 구문 내에서 SecurityCritical 메서드 사용 불가 [2]파일 다운로드1
1682정성태6/1/201426077.NET Framework: 441. .NET CLR4 보안 모델 - 3. CLR4 보안 모델에서의 APTCA 역할파일 다운로드2
1681정성태6/1/201421952.NET Framework: 440. .NET CLR4 보안 모델 - 2. 샌드박스(Sandbox)을 이용한 보안 [2]파일 다운로드1
1680정성태6/1/201421421.NET Framework: 439. .NET CLR4 보안 모델 - 1. "Security Level 2"란?파일 다운로드1
... 121  122  123  124  125  126  127  128  129  130  131  132  133  [134]  135  ...