以下代码正在生成事务错误。
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>
回顾:
当多线程 @ 10x 时,这种情况几乎不会发生,当多线程 @ 20+ x 时,这种情况会变得越来越频繁。
有什么想法吗?