首页 > 解决方案 > Django 事务不适用于原始 SQL 查询

问题描述

因为我厌倦了 Django DB 驱动程序的隐式行为,所以我有以下代码和一个普通的 Postgres 事务:

from django.db import transaction, connection
from concurrent.futures.thread import ThreadPoolExecutor

def commit_or_rollback(commit: bool):
    query = "COMMIT" if commit else "ROLLBACK"
    with connection.cursor() as cursor:
        cursor.execute(query)

def insert(query, parameter):
    with connection.cursor() as cursor:
        cursor.execute(query, parameter)

def insert_with_threads():
    insert_pool = ThreadPoolExecutor(max_workers=4)
    query = 'INSERT INTO a_table VALUES (%s)'
    parameters = [...]
    for parameter in parameters:
        insert_pool.submit(insert, query, parameter)

# "Main" program
try:
    with connection.cursor() as cursor:
        cursor.execute("BEGIN")

    insert_with_threads()  # Could raise any of the caught exceptions

except CustomException1:
    commit_or_rollback(False)
except CustomException2:
    commit_or_rollback(False)
except Exception as e:
    commit_or_rollback(False)
    # Some general stuff
else:
    commit_or_rollback(True)

但是没有任何东西回滚,我已经尝试过, 和transaction.atomic()rawset_autocommit()但没有。线程会破坏东西吗?打开多个游标有问题吗?set_autocommit() BEGIN

任何形式的帮助将非常感激

标签: pythondjangopostgresqlpsycopg2

解决方案


绝对是多线程的问题(我使用的是 ThreadPoolExecutor)。现在我正在使用 ProcessPoolExecutor 并按预期工作


推荐阅读