Django之事务操作

 

在Django中实现数据库的事务操作

在学习MySQL数据库时,MySQL数据库是支持原子操作的.

什么是数据库的原子操作呢??打个比方,一个消费者在一个商户里刷信用卡消费.

交易正常时,银行在消费者的账户里减去相应的款项,在商户的帐户加上相应的款项.

但是如果银行从消费者的账户里扣完钱之后,还未在商户的帐户里加上相应的款项时.

由于某些原因,系统或者数据库出现异常了,那么此时钱已经从消费者的账户里扣除了,但是商户的账户里却没有加上相应的款项,让会让商户遭受损失.

这种情况下,最好的解决办法就是使用数据库的原子性操作.

如果数据库使用了事务操作,当出现上面的操作异常时,待数据库正常运行后,数据库系统会把先前执行了一半的操作退回到这个操作之前的状态,

这个通常称为数据库的回滚,也即数据库的原子性操作.

Django中,正常的数据库操作应该是原子性操作的.

 

# 导入模块
from django.db import transaction

# 事务操作
with transaction.atomic():
    comment_obj = models.Comment.objects.create(user_id=user_id, article_id=article_id, content=content,
                                                parent_comment_id=pid)
    models.Article.objects.filter(pk=article_id).update(comment_count=F("comment_count") + 1)

另一种方式

对整个view视图开启事务

from django.db import transaction

@transaction.atomic
def index(request):
    //ORM操作
    return ....

注意:在原子块中,不要进行错误捕获;

当退出原子块的时候,Django会去查看它是否正常退出或者是否有异常来确定是否提交或者回滚,

 

如果你捕获并处理了原子块中的异常,可能会隐藏Django中发生问题的事实。这样可能会造成非预期的行为。

 

posted @ 2018-10-29 16:22  huangyanpeng  阅读(129)  评论(0)    收藏  举报