python - 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
任何形式的帮助将非常感激
解决方案
绝对是多线程的问题(我使用的是 ThreadPoolExecutor)。现在我正在使用 ProcessPoolExecutor 并按预期工作
推荐阅读
- c# - C# POS - 'Microsoft.PointOfService.Management.Explorer' 的类型初始化程序引发异常
- azure - Azure 映射 REST API 链接不起作用
- php - 可能有错误的 PHP 安装 - 信息页空白 - LAMP
- c++ - 如何通过 Valgrind 查找 QThreads 程序中的内存泄漏在哪里?
- lora - 路由键逻辑
- android - Kotlin 设置文本方法不起作用
- python - 如何在 git 中测试前/后提交脚本?
- performance - 从 Haskell 中的一元流中提取更多性能
- angular - 从其他模块导入组件时出错
- java - 在android中扭曲视图