多线程中的pymssql事务错误

问题描述 投票:0回答:0

以下代码正在生成事务错误。

The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.

gevent池越大,错误越频繁

    sql_filter = 'WHERE column1=1'
    transaction_name = ''.join(random.choices(string.ascii_uppercase, k=5))
    self.cursor.execute(f"""BEGIN TRANSACTION {transaction_name};
                                       INSERT INTO {target_table} ({columns_to_copy}) 
                                       SELECT {columns_to_copy} FROM {source_table} {sql_filter};
                                       DELETE FROM {source_table} {sql_filter};
                                       COMMIT TRANSACTION {transaction_name};""")
    self.db.commit()

self
是一个在
__init__
上实例化数据库连接的类。

实例化发生在通过 gevent 的多线程“之后”,即:我首先有

pool.spawn(collector, target_table, source_table, columns_to_copy, sql_filter)

并且对收集器的调用包括数据库连接的实例化,如下所示:

def collector( target_table, source_table, columns_to_copy, sql_filter):
    mydb = MySQLClass(host=SQL_HOST, database_name='mydb', user=myuser, password=mypw)

    .....
    <call to a function where the transaction defined above occurs>

回顾:

  1. 池产卵
  2. 收集器中的 mydb 实例化
  3. 调用 cursor.execute(TRANSACTION)

当多线程 @ 10x 时,这种情况几乎不会发生,当多线程 @ 20+ x 时,这种情况会变得越来越频繁。

有什么想法吗?

python-3.x multithreading gevent pymssql
© www.soinside.com 2019 - 2024. All rights reserved.