Как правильно обрабатывать `SQLExecDirectW` и` SQLEndTran` (ошибка 0x20), используя SQLAlchemy и pyodb c? - PullRequest
0 голосов
/ 09 апреля 2020

Я программирую многопоточное приложение, используя 10 потоков, каждый из которых создает сеанс в начале al oop и уничтожает его в конце:

try:
    ss = Session()
    ...
    ss.add_all(object_matches) # list of objects to add to the database
    ss.commit()
finally:
    ss.close()

Моя проблема - ошибки SQLEndTran и SQLExecDirectW (см. Ниже), которые происходят, по-видимому, случайным образом с моим сервером MS SQL. Я прочитал документы для описания соответствующего кода ошибки (0x20), но создание движка с pool_pre_ping=True не решает проблему:

engine = create_engine("mssql+pyodbc://sa:P@ssw0rd@localhost:1433/watchdog?driver=ODBC+Driver+17+for+SQL+Server", pool_size=20, max_overflow=10, pool_pre_ping=True, echo=False)

Также не могут настройки autocommit=True: ss = Session(autocommit=True)

В качестве возможного решения я commit() повторяюсь в al oop и создаю исключение, только если это происходит три раза:

for i in range(3):
    try:
        ss.add_all(object_matches)
        ss.commit()
    except Exception as e:
        if i == 2: raise e
    else:
        break

Это правильный способ справиться с этими ошибками или как мне их исправить?

Примечание. Я использую MS SQL с использованием Docker образа: mcr.microsoft.com/mssql/server.

SQLEndTran :

ERROR -- 04/09/2020 09:43:04 AM -- sqlalchemy.pool.impl.QueuePool -- ThreadPoolExecutor-0_6  -- Exception during reset or similar
Traceback (most recent call last):
  File "/Users/nlykkei/projects/atlassian-watchdog/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 733, in _rollback_impl
    self.engine.dialect.do_rollback(self.connection)
  File "/Users/nlykkei/projects/atlassian-watchdog/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 538, in do_rollback
    dbapi_connection.rollback()
pyodbc.OperationalError: ('08S01', '[08S01] [Microsoft][ODBC Driver 17 for SQL Server]TCP Provider: Error code 0x20 (32) (SQLEndTran)')

SQLExecDirectW :

ERROR -- 04/09/2020 09:43:55 AM -- root -- ThreadPoolExecutor-0_2  -- (pyodbc.OperationalError) ('08S01', '[08S01] [Microsoft][ODBC Driver 17 for SQL Server]TCP Provider: Error code 0x20 (32) (SQLExecDirectW)')
[SQL: INSERT INTO objects (id, version, type, rest_url, space_id, title, created_by, created_time, modified_by, modified_time) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]
[parameters: (('335810454', 1, 'attachment', 'https://confluence.danskenet.net/rest/api/content/335810454', 36831243, 'DPO Article 32 Assessment Digital Signing.pdf', 'BD7863', datetime.datetime(2020, 4, 7, 16, 14, 26, 727000, tzinfo=datetime.timezone(datetime.timedelta(seconds=7200))), 'BD7863', datetime.datetime(2020, 4, 7, 16, 14, 26, 727000, tzinfo=datetime.timezone(datetime.timedelta(seconds=7200)))), ('254106314', 23, 'page', 'https://confluence.danskenet.net/rest/api/content/254106314', 36831243, 'Cloud 2 Front End Assessment 2019-2020', 'BD7863', datetime.datetime(2019, 11, 13, 9, 48, 40, 323000, tzinfo=datetime.timezone(datetime.timedelta(seconds=3600))), 'BD7863', datetime.datetime(2020, 4, 7, 16, 15, 14, 907000, tzinfo=datetime.timezone(datetime.timedelta(seconds=7200)))))]
(Background on this error at: http://sqlalche.me/e/e3q8)
Traceback (most recent call last):
  File "/Users/nlykkei/projects/atlassian-watchdog/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1228, in _execute_context
    cursor, statement, parameters, context
  File "/Users/nlykkei/projects/atlassian-watchdog/lib/python3.7/site-packages/sqlalchemy/dialects/mssql/pyodbc.py", line 413, in do_executemany
    cursor, statement, parameters, context=context
  File "/Users/nlykkei/projects/atlassian-watchdog/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 585, in do_executemany
    cursor.executemany(statement, parameters)
pyodbc.OperationalError: ('08S01', '[08S01] [Microsoft][ODBC Driver 17 for SQL Server]TCP Provider: Error code 0x20 (32) (SQLExecDirectW)')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...