<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Django transaction.atomic 事務(wù)的使用

      函數(shù) transaction.atomic

      數(shù)據(jù)庫的讀寫操作中,事務(wù)在保證數(shù)據(jù)的安全性和一致性方面起著關(guān)鍵的作用,而回滾正是這里面的核心操作。

      遇到并發(fā)的時候常常會因?yàn)榻涌诘脑L問順序或者其他情況,導(dǎo)致數(shù)據(jù)的不一致,這時候就知道回滾的重要性了,下面有個簡單的小例子 可以實(shí)現(xiàn)數(shù)據(jù)庫事務(wù)的操作

      Demo

      數(shù)據(jù)庫的模型和返回值窩這邊就不貼出來了
      這是一個接口

      from django.db import transaction
      import time
      def keke_test(request):
          code = 1
          msg = '操作成功'
      
          g = request.REQUEST.post
          params = dict()
          model_id = g.get('id', '0')
          model = None
          if model_id > 0:
              model = IosSdkVersions.objects.filter(id=model_id).first()
              with transaction.atomic():  # 禁止自動提交,保證該函數(shù)中的所有數(shù)據(jù)庫操作在同一個事物中,第一個數(shù)據(jù)庫操作1即使成功保存到數(shù)據(jù)庫中,只要第2個數(shù)據(jù)操作失敗,那么所有該段代碼所有設(shè)計(jì)的都會更改回滾到原來
                  try:
                      sdk_flag_model = IosSdkTest.objects.filter(id=1).first()
                      sid = transaction.savepoint()  # 開啟事務(wù)設(shè)置事務(wù)保存點(diǎn)
                      sdk_flag_model.sdk_flag = 8
                      sdk_flag_model.save() # 完成就保存,但不是馬上提交
                      time.sleep(10)
                      all_issue_field_value = IosSdkVersions.objects.filter(id=3)
                      for issue in all_issue_field_value:
                          issue.test_id = 8
                          issue.save()
                          # 1 / 0
                  except Exception as e:
                      print(e)
                      transaction.savepoint_rollback(sid)  # 失敗回滾事務(wù)(如果數(shù)據(jù)庫操作發(fā)生異常,回滾到設(shè)置的事務(wù)保存點(diǎn))
                      print('數(shù)據(jù)保存失敗')
                      code = -1001
                  else:
                      code = 1
                      transaction.savepoint_commit(sid)  # 如果沒有異常,成功提交事物
      
          params['code'] = code
          return json_response(params)
      
      # 接口2,當(dāng)執(zhí)行第一個接口的時候,因?yàn)閟leep的存在,這個操作會一直等待到第一個接口完成操作 再進(jìn)行操作
      def keke_test2(request):
          code = 1
          msg = '操作成功'
          _g = request.REQUEST.get
          sdk_flag_model = IosSdkTest.objects.filter(id=1).first()
          sdk_flag_model.sdk_flag = 2
          sdk_flag_model.save() # 因?yàn)楸绘i住了所以接口會等到上一個接口的完成
          # if sdk_flag_model.sdk_flag == 8:
              # all_issue_field_value = IosSdkVersions.objects.filter(id=3)
              # for issue in all_issue_field_value:
              #     issue.test_id -= 2
              #     issue.save()
          params = dict()
          return json_response(params)
      
      # 接口2 other
      def keke_test2(request):
          code = 1
          msg = '操作成功'
          _g = request.REQUEST.get
          sdk_flag_model = IosSdkTest.objects.filter(id=1).first()
          if not sdk_flag_model.sdk_flag == 2: # 會等到flag為2的時候才去執(zhí)行下面的操作
              sdk_flag_model.sdk_flag = 3
              sdk_flag_model.save()
          params = dict()
          params['code'] = code
          return json_response(params)
      
      # other
      
      def keke_test2(request):
          code = 1
          msg = '操作成功'
          _g = request.REQUEST.get
          with transaction.atomic():  # 禁止自動提交,保證該函數(shù)中的所有數(shù)據(jù)庫操作在同一個事物中,第一個數(shù)據(jù)庫操作1即使成功保存到數(shù)據(jù)庫中,只要第2個數(shù)據(jù)操作失敗,那么所有該段代碼所有設(shè)計(jì)的都會更改回滾到原來
              sid = transaction.savepoint()  # 開啟事務(wù)設(shè)置事務(wù)保存點(diǎn)
              try:
                  sdk_flag_model = IosSdkTest.objects.select_for_update().get(id=1) # 互扯鎖的另一種實(shí)現(xiàn)
                  sdk_flag_model.sdk_flag = 8
                  sdk_flag_model.save()
                  time.sleep(10)
              except Exception as e:
                  print(e)
                  transaction.savepoint_rollback(sid)  # 失敗回滾事務(wù)(如果數(shù)據(jù)庫操作發(fā)生異常,回滾到設(shè)置的事務(wù)保存點(diǎn))
                  print('數(shù)據(jù)保存失敗')
                  code = -1001
              else:
                  code = 1
                  transaction.savepoint_commit(sid)  # 如果沒有異常,成功提交事物
          params = dict()
          params['code'] = code
          return json_response(params)
      

      悲觀鎖

      # 悲觀鎖實(shí)現(xiàn), 都要放在 with transaction.atomic() 事務(wù)中 同條數(shù)據(jù)上鎖完,需要等釋放后才能再次上鎖的吧
      
      def keke_test2(request):
          code = 1
          msg = '操作成功'
          _g = request.REQUEST.get
          with transaction.atomic():  # 禁止自動提交,保證該函數(shù)中的所有數(shù)據(jù)庫操作在同一個事物中,第一個數(shù)據(jù)庫操作1即使成功保存到數(shù)據(jù)庫中,只要第2個數(shù)據(jù)操作失敗,那么所有該段代碼所有設(shè)計(jì)的都會更改回滾到原來
              sid = transaction.savepoint()  # 開啟事務(wù)設(shè)置事務(wù)保存點(diǎn)
              try:
                  sdk_flag_model = IosSdkTest.objects.select_for_update().get(id=1)  # 互扯鎖的另一種實(shí)現(xiàn)
                  sdk_flag_model.sdk_flag = 8
                  sdk_flag_model.save()
                  time.sleep(10)
              except Exception as e:
                  print(e)
                  transaction.savepoint_rollback(sid)  # 失敗回滾事務(wù)(如果數(shù)據(jù)庫操作發(fā)生異常,回滾到設(shè)置的事務(wù)保存點(diǎn))
                  print('數(shù)據(jù)保存失敗')
                  code = -1001
              else:
                  code = 1
                  transaction.savepoint_commit(sid)  # 如果沒有異常,成功提交事物
          params = dict()
          params['code'] = code
          return json_response(params)
      
      
      def keke_test3(request):
          code = 1
          msg = '操作成功'
          _g = request.REQUEST.get
          with transaction.atomic():
              sdk_flag_model = IosSdkTest.objects.select_for_update().get(id=1)
              print(sdk_flag_model.sdk_flag)
          params = dict()
          params['code'] = code
          return json_response(params)
      

      原生sql 鎖的操作

      參考:https://segon.cn/mysql-for-update.html

      posted @ 2021-08-27 10:58  陳科科  閱讀(2230)  評論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 国产成人一区二区不卡| 国产国产午夜福利视频| 最新亚洲人成网站在线观看 | 欧美高清一区三区在线专区| 亚洲偷自拍国综合| 亚洲最大的成人网站| 欧美大胆老熟妇乱子伦视频| 亚洲天堂精品一区二区| 欧美偷窥清纯综合图区| 国产精品爽爽va在线观看网站| 国产精品高清中文字幕| 国产精品久久久久鬼色| 久久婷婷五月综合色99啪ak| 亚洲成人av在线系列| 国产精品久久久久影院色| 国产成人亚洲综合| 美女无遮挡免费视频网站| 水蜜桃视频在线观看免费18| 亚洲日韩VA无码中文字幕| 国产盗摄xxxx视频xxxx| 亚洲成a人片在线观看久| 一本色道久久88亚洲综合| 国产情侣激情在线对白| 乱色老熟妇一区二区三区| 熟妇无码熟妇毛片| 亚洲AV日韩精品久久久久| 久青草视频在线免费观看| 婷婷丁香五月深爱憿情网| 加勒比中文字幕无码一区| 精品中文人妻中文字幕| 国产狂喷潮在线观看| 人人做人人妻人人精| 福利一区二区不卡国产| 国产91精品一区二区亚洲 | 国内熟妇人妻色在线视频| 日韩人妻熟女中文字幕a美景之屋| 久久久久久久久18禁秘| 国产日韩精品一区二区在线观看播放| 亚洲国产良家在线观看| 亚洲av本道一区二区| 国产亚洲精品成人aa片新蒲金|