1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > djongo mysql 回滚_django事物回滚

djongo mysql 回滚_django事物回滚

时间:2021-03-22 13:25:45

相关推荐

djongo mysql 回滚_django事物回滚

往数据库写入数据时,不经意间就会写入不完整的数据,我们称之为脏数据。事务管理(transaction)可以防止这种情况发生。事务管理一旦检测到写入异常,会执行回滚操作,即要么写入完整的数据,要么不写入。在Django中使用事务很简单:

1.新建项目Transaction,创建应用app01,编辑models创建两张表并执行数据库迁移,如下:

from django.db import models

class UserInfo(models.Model):

username = models.CharField(max_length=32)

email = models.EmailField(max_length=64)

class Dept(models.Model):

title = models.CharField(max_length=32)

2.定义路由:

from django.conf.urls import url

from app01 import views

urlpatterns = [

url(r'^test/$', views.test),

]

3.定义test视图函数;

from django.shortcuts import render, HttpResponse

from . import models

def test(request):

try:

from django.db import transaction # 导入事务

with transaction.atomic():

user_obj = models.UserInfo.objects.create(username='Lena', email='example@')

dept_obj = models.Dept.objects.create(title='IT')

except Exception as e:

return HttpResponse('error happened, db rollback')

return HttpResponse('OK')

复制代码

说明:

以上将创建user_obj和dept_obj记录的行为组合成一个不可分割的原子性操作,原子内执行的数据库操作发生任何异常,都会执行回滚操作。

事物检查异常回滚,但是不容错,错误还是会抛出,因此这里用了异常捕捉。

正常情况下访问http://127.0.0.1:8000/test/,将会得到OK响应,如果我们手动将dept_obj = models.Dept.objects.create(title='IT')的title='IT'改为name='IT',手动造成异常,那么会触发事物回滚,写入的user_obj也会撤销。这一点可以查看数据库验证。

注意:事务需要数据库引擎支持,比如Innodb引擎就是支持的。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。