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

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 模电中二极管,三极管和电容的应用
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络