首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Django数据库--事务及事务

有事务出错整体操作,也有基于保存点部分。本文将讨论Django这两种机制运行原理。...为了设置保存点,即断点进行事务执行和可以嵌套使用with transaction.atomic,例如官网例子(伪代码): with transaction.atomic(): #...二、保存点Savepoint(断点回) 保存点是事务中标记,从原理实现上来说是一个类似存储结构类。可以部分事务,而不是完整事务,同时会保存部分事务。python后端程序可以使用保存点。...工作原理:savepoint通过对返回sid后面的将要执行数据库操作进行计数,并保存在内置列表中,对数据库数据库进行操作遇到错误而中断,根据sid寻找之前保存点并回数据,并将这个操作从列表中删除...相关API: 1. savepoint(using = None) 创建一个新保存点。这表示处于正常状态事务一个点。返回保存点ID(sid)。在一个事务中可以创建多个保存点。

3.8K10

Django model 层之事务管理总结

显示控制事务 atomic(using=None, savepoint=True) 用法1:把atomic装饰器使用 from django.db import transaction @transaction.atmoic...(): # 以下代码(with作用范围内),将放在同一个事务中,一起执行 do_more_stuff() 可以把atomic封装在一个try/except语句块内 from django.db...except Exception as e: handle_exception() add_children() 说明: 如果try:...except 语句块发生异常,那么do_stuff()所作改变将被...但是create_parent(),add_children()所作改变不会被。...特别要注意,不要在with transaction.atomic():作用范围内捕获异常,否则会有意想不到后果,因为Django是根据未捕获数据库异常来判断并执行 处于性能考虑,尽量保证事务尽可能

69230
您找到你想要的搜索结果了吗?
是的
没有找到

08.Django基础六之ORM中锁和事务

反之,如果有异常,更改会被。     被atomic管理起来代码块还可以内嵌到方法中。...如果你试图在前执行一些数据库操作,Django会抛出TransactionManagementError。通常你会在一个ORM相关信号处理器抛出异常遇到这个行为。...这么做好处是:异常发生,它能明确地告诉你那些操作需要回,而那些是不需要。     为了保证原子性,atomic还禁止了一些API。...像试图提交、事务,以及改变数据库连接自动提交状态这些操作,在atomic代码块中都是不予许,否则就会抛出异常。   ...下面是Django事务管理代码: 进入最外层atomic代码块开启一个事务; 进入内部atomic代码块创建保存点; 退出内部atomic释放或事务;注意如果有嵌套,内层事务也是不会提交

2.1K40

2017年9月6日

django事务处理 django可以设置所有http requests级别的事务,通过给配置文件数据库部分配置TOMIC_REQUESTS = True, 这相当于给每一个view函数都加了 @transaction.atomic...不可以在with里面加捕获那样会掩盖异常造成不会。 5. rollback不会保证model状态回到之前状态,这个需要手动恢复原来状态。...如果想在commit之后做一些操作,可以使用 transaction.on_commit(func),该方法会在事务提交之后执行,的话不执行。...9.在django测试TestCase中,测试方法开启一个事务,并在执行完后,所以里面的on_commit注册方法总不会被执行。...atomic()里面的话,发生了异常用保存点处理了但是atomic()不知道你处理了没有,所以还会, 为了解决这个问题,可以用两个行数 get_rollback(using=None)[source

93660

django-transaction 事务

事务 #0 GitHub https://github.com/Coxhuang/django-transaction.git #1 环境 Python3.6 Django==2.0.6 #2 需求...用户数据包括基本资料表A,特殊资料表B;在新增用户,需要对表A和表B进行操作,如果A添加数据成功,但是B添加数据失败,此时,我们希望A数据也被删除 在支付时候,如果支付中发生异常,那么异常之前操作...,我们也希望回到原始状态 #3 事务 事务就是在操作数据库,如果发生异常,能让数据回到原来状态 #4 使用 #4.1 新建一个django项目 没有使用事务 def new_stu(request...使用事务,但没有发生异常 from django.db import transaction def new_stu(request): with transaction.atomic()...使用事务,发生异常 from django.db import transaction def new_stu(request): with transaction.atomic():

1.2K10

Django实战-提供数据库事务功能

Django网络应用开发5项基础核心技术包括模型(Model)设计,URL 设计与配置,View(视图)编写,Template(模板)设计和Form(表单)使用。...from django.db import transaction 使用事务可以有效防止插入数据出现错误,影响数据完整性,再出现错误时候可以事务,做到要么全部插入成功要么全部都不插入。...一、事务修饰器 视图代码中使用保存点来担任子事务角色,atomic()上下文管理器。那么,最后所有更改要么被提交,要么被可以简单使用atomic()装饰器来装饰每一个视图方法。...在Django中,还提供了保存点支持,可以在事务中创建保存点来记录数据特定状态,数据库出现错误时,可以恢复到数据保存点状态。...from django.db import transaction # 创建保存点 save_id = transaction.savepoint() # 滚到保存点 transaction.savepoint_rollback

54630

【愚公系列】2022年02月 Python教学课程 57-Django框架之事务和分布式事务

I(Isolation):隔离性,数据库中事务一般都是并发,隔离性是指并发两个事务执行互不干扰,一个事务不能看到其他事务运行过程中间状态。通过配置事务隔离级别可以避脏读、重复读等问题。 ​...D(Durability):持久性,事务完成之后,该事务对数据更改会被持久化到数据库,且不会被。 ​...数据库事务在实现时会将一次事务涉及所有操作全部纳入到一个不可分割执行单元,该执行单元中所有操作要么都成功,要么都失败,只要其中任一操作执行失败,都将导致整个事务 2.分布式事务 分布式系统会把一个应用系统拆分为可独立部署多个服务...一、单数据库事务 在 Django可以通过django.db.transaction 模块提供atomic来定义一个事务 1.装饰器用法 from django.db import transaction...Django 自动提交 pass with transaction.atomic(): # 这部分代码会在事务中执行 pass with 语句用法:可以灵活有选择性把某些

44320

Python3出现“No module named MySQLdb“问题-以及使用PyMySQL连接数据库

(sql) # 向数据库提交 db.commit() except: # 发生错误时 db.rollback() 对于支持事务数据库,在Python数据库编程中,游标建立之时,就自动开始了一个隐形数据库事务...commit()方法游标的所有更新操作,rollback()方法当前游标的所有操作。每一个方法都开始了一个新事务。...错误处理 异常 描述 Warning 有严重警告触发,例如插入数据是被截断等等。必须是StandardError子类。 Error 警告以外所有其他错误类。...必须是StandardError子类。 InterfaceError 有数据库接口模块本身错误(而不是数据库错误)发生触发。必须是Error子类。...DatabaseError 和数据库有关错误发生触发。必须是Error子类。 DataError 有数据处理错误发生触发,例如:除零错误,数据超范围等等。

28.1K64

python技术面试题(十九)--腾讯

4.Django中ORM如何使用? Django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表增删改查操作。...定义模型,我们继承了 models.Model,这个模块在 django.db中。我们在查询操作,需要导入模型类,通过类和对象完成数据增删改查。...6.析构函数 答:析构函数就是对象结束其生命周期,比如对象所在函数已经调用完毕,程序结束,系统自动执行析构函数。在python中,一个对象引用计数为0时候, __del__会被自动调用。...原子性(Atomicity)指的是一个事务必须被视为一个不可分割最小工作单元,整个事务中所有操作要么全部提交成功,要么全部失败。...a = [1,2,3] def fuc(a): a.append(1) print(a) fuc(a) 结果为: [1, 2, 3, 1] 可以看出,确实改变了。

3.7K40

【愚公系列】2022年02月 Python教学课程 58-Django框架之悲观锁和乐观锁

比如用户A和用户B获取某一商品库存并尝试对其修改,A, B查询商品库存都为5件,结果A下单5件,B也下单5件,这就出现问题了。解决方案就是操作( 查询或修改)某个商品库存信息对其加锁。...乐观锁适用于多读应用类型,这样可以提高吞吐量,像数据库提供类似于write_condition机制,其实都是提供乐观锁。...from django.db import transaction with transaction.atomic(): entries = Entry.objects.select_for_update...你可以通过select_for_update(of=(…))方法指定需要锁定关联对象。...二、Django乐观锁 Django项目中实现乐观锁可以借助于django-concurrency这个第三方库, 它可以模型增加一个version字段,每次执行save操作时会自动给版本号+1。

37920

美多商城项目(九)

: rollback; 3.2mysql事务保存点 在事务中,可以设置事务保存点,设置了事务保存点之后,在进行事务可以不回整个事务,而是滚到指定保存点,该保存点之后sql语句执行结果会撤销...import transaction with transaction.atomic(): # with语句块下面的代码,凡是涉及到数据库操作代码,在进行数据库操作,都会放在同一个事务中...(代码) # 滚到指定保存点 transaction.savepoint_rollback(sid) atomic会自动进行事务提交commit和rollback。...只有操作数据库sql语句有错时候才能自动进行提交和。...4.订单并发 4.1问题描述 多个人同时购买同一件商品,有可能会产生订单并发问题。

95210

一个数据库事务 Bug 引发惨剧

款项到账,付款操作完成,这个模块会更新实例状态: class PayoutProcess(models.Model): @classmethod def mark_paid(cls...这个批量流程正在使用它自己数据库事务!信号发送后,如果批量付款中后面的一次付款失败,付款操作还可以。...这里说明一下,如果我们要批量标记三笔付款,而第三笔未能成功标记,那么所有三笔付款操作都会,但前两笔通知已经发送出去了: >>> from django.db import transaction...注意代码中,即便第三笔付款失败导致外部事务所有三笔付款,前两笔付款成功通知还是会发送出去。...为了加快速度,Django 会在每次测试开始启动一个数据库事务,然后立即它。以这种方式执行测试是防止更改数据库中数据各个测试相互影响快速方法。

92820

django中嵌套try-except实例

orm列表扁平化,列表交集,批量删除 补充知识:Django 在异常捕获中进行数据库保存,保存后将异常再抛出 需求: 当我检查配额,如果配额不足,我需要将订单状态改为5,然后再将原有异常抛出 一:...默认开启了事务,因此我保存订单状态后,再抛异常没有任何问题 但当我查询数据库订单状态,发现异常抛出之前订单改变状态已经丢失 二:优化,使用装饰器,手动关闭事务 # 在dispatch方法上增加装饰器...create_form) # 检查配额 except Exception as e: self.object.state = 5 self.object.save() raise e 该方法可以解决上述问题...如果不满足xxxxxxxx条件,则执行事务,此时我们定义保存点之前a.save()数据不会收到影响,但在保存点之后b.save()数据将会。...所以我们可以通过调整保存点位置,实现我们需求。 以上这篇django中嵌套try-except实例就是小编分享给大家全部内容了,希望能给大家一个参考。

2.1K10

【DB笔试面试428】在Oracle中,实例恢复和介质恢复区别是什么?

数据库突然崩溃,而还没有来得及将Buffer Cache里脏块刷新到数据文件里,同时在实例崩溃正在运行着事务被突然中断,则事务为中间状态,也就是既没有提交也没有。...② 由于DBWn进程是异步向磁盘写入数据,所以,数据文件中可能包含没有被提交但已经写入数据文件改变,这些改变必须滚到之前状态,以确保数据一致性。...有时,新事务可以自己个别块以获取所需数据,而不必等待SMON进程来回这些已终止事务。在数据库打开以后,SMON进程还没来得及这些中间状态数据块,就有用户进程发出读取这些数据块请求。...Oracle数据库应用Undo块滚在数据块中未提交改变,这些数据块是在实例失败之前或者前滚期间被写入会将已执行但尚未提交更改会返回到初始状态。...完成之后,整个实例恢复才算完成,而Redo和Undo丢失或者损坏都可能导致实例恢复失败。Oracle数据库可以根据需要同时多个事务。

1.5K21

在Oracle中,实例恢复和介质恢复区别是什么?

数据库突然崩溃,而还没有来得及将Buffer Cache里脏块刷新到数据文件里,同时在实例崩溃正在运行着事务被突然中断,则事务为中间状态,也就是既没有提交也没有。...② 由于DBWn进程是异步向磁盘写入数据,所以,数据文件中可能包含没有被提交但已经写入数据文件改变,这些改变必须滚到之前状态,以确保数据一致性。...有时,新事务可以自己个别块以获取所需数据,而不必等待SMON进程来回这些已终止事务。在数据库打开以后,SMON进程还没来得及这些中间状态数据块,就有用户进程发出读取这些数据块请求。...Oracle数据库应用Undo块滚在数据块中未提交改变,这些数据块是在实例失败之前或者前滚期间被写入会将已执行但尚未提交更改会返回到初始状态。...完成之后,整个实例恢复才算完成,而Redo和Undo丢失或者损坏都可能导致实例恢复失败。Oracle数据库可以根据需要同时多个事务。

1.7K20

django-apschedule定时任务异常停止

再看_process_jobs中内容,在BaseScheduler实现,主要流程如下,先找到所有要执行job,然后进行遍历运行并更新Job状态。...这个是因为,关闭数据库连接,程序不一定可以正好运行在update_job,可以看到前面的get_due_jobs进行了异常捕获,如果这里抛出数据库连接异常是可以捕获到,然后跳过后面的操作,等待下一次定时任务执行...复现 我们将断点打在jobstore.update_job(job)上,然后使用debug模式进行调试,程序运行到断点上,将数据库关闭,然后程序继续运行,则会报错,并抛出异常,线程停止了运行。...# listener apschedule中提供了监听器机制,也就是在定时任务成功、失败等状态可以通过提前注册listener方法来进行调。但通过分析源码,其并不能捕获到定时任务线程异常。...然后再次尝试复现该问题,可以发现在断开数据库后,它能够一直进行重试,线程没有停止,数据库恢复运行后,job执行成功,不再抛出异常。

33160
领券