engrave. 2023-02-16 09:50 采纳率: 71.4%
浏览 79
已结题

django多线程环境事务

问题:python,django多线程读取ecel并导入到数据库,主线程事务有效,子线程事务失效
代码截图

img

img

问题简化版:

img

    @action(methods=['post'], detail=False)
    @transaction.atomic
    def uploadTest(self, request):
        data = {'code': 0, 'msg': '', 'data': []}
        connection.cursor().execute("INSERT INTO bby_test (id, name,age) VALUES (%s, %s, %s)", (1, 'name', 1))
        for i in range(0, 5):
            # 1.多线程调用 X
             pool.submit(Test,i)
            # 2.方法调用 √
             Test(i)
            # 问题:如何操作使多线程达到普通方法调用的效果,使一次子线程失败,所有子线程及主线程保持一致,不去操作数据库
        return JsonResponse(data)

def Test(i):
    print(i)
    if i % 2 == 0:
        a = 1/0
    connection.cursor().execute("INSERT INTO bby_test (id, name,age) VALUES (%s, %s, %s)", (2, 'name2', 2))

  • 写回答

6条回答 默认 最新

  • 社区专家-Monster-XH 2023-02-16 09:56
    关注

    基于Monster 组和GPT的调写:
    在你的情况下,主线程中的事务是有效的,因为它是由Django框架自动创建和管理的。但是在子线程中,你需要手动创建事务,并手动提交或回滚,否则事务将不会生效。

    你可以通过使用django.db.connections来在子线程中手动创建和管理数据库连接和事务。以下是一个示例代码:

    
    from django.db import connections
    
    def import_data():
        # 从excel中读取数据
        # ...
    
        # 获取数据库连接
        connection = connections['default']
    
        # 开始事务
        with connection.cursor() as cursor:
            cursor.execute("BEGIN")
    
        try:
            # 将数据导入到数据库中
            # ...
    
            # 提交事务
            with connection.cursor() as cursor:
                cursor.execute("COMMIT")
        except:
            # 回滚事务
            with connection.cursor() as cursor:
                cursor.execute("ROLLBACK")
    
    

    在子线程中,你需要使用connections来获取数据库连接,并使用cursor来手动执行SQL语句。在执行SQL语句之前,你需要使用BEGIN命令来开启一个事务,在执行完SQL语句后,使用COMMIT命令提交事务,如果出现异常,则需要使用ROLLBACK命令回滚事务

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 2月25日
  • 已采纳回答 2月17日
  • 修改了问题 2月16日
  • 创建了问题 2月16日

悬赏问题

  • ¥15 2024-五一综合模拟赛
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭