Django中的事务(Transaction)管理

Django 默认的事务行为

默认情况下,在Django中事务是自动提交的当我们运行Django内置的模板修改函数时,例如调用model.save()或model.delete()时,事务将被立即提交这种机制和数据库的自动提交事务机制类似。记住这里没有默认的回滚机制。

在HTTP 请求上加事务

对于Web请求,Django官方推荐使用中件间TransactionMiddleware来处理请求和响应中的事务它的工作原理是这样的:当一个请求到来时,Django开始一个事务,如果响应没有出错,Django提交这期间所有的事务,如果view中的函数抛出异常,那么Django会回滚这之间的事务

为了实现这个特性,需要在MIDDLEWARE_CLASSES setting中添加TransactionMiddleware:

MIDDLEWARE_CLASSES = (

    'django.middleware.cache.UpdateCacheMiddleware',

    'django.contrib.sessions.middleware.SessionMiddleware',

    'django.middleware.common.CommonMiddleware',

    'django.middleware.transaction.TransactionMiddleware',

    'django.middleware.cache.FetchFromCacheMiddleware',

顺序很重要,TransactionMiddleware中间件会将置于其后的中间件都包含在事务的范围之中(用于缓存的中间件除外,他们不受影响,例如CacheMiddleware,UpdateCacheMiddlewareFetchFromCacheMiddleware

另外需要注意的是,TransactionMiddleware只会影响DATABASES设置中的默认的数据库,对于其它的数据库,如果我们实现事务控制的话只能用别的方案了

在View 中实现事务控制

如果想在更细粒度的条件下(例如在一个view函数中)控制事务,我们可以使用django.db.transaction。有两种用法:

1.使用装饰器

from django.db import transaction

@transaction.commit_on_success

def viewfunc(request):

    # this code executes inside a transaction

2.使用context manager

from django.db import transaction

def viewfunc(request):

    # this code executes using default transaction management

    with transaction.commit_on_success():

        # this code executes inside a transaction

这两种方法都可以正常工作不过如果使用的Python版本为2.5并且要使用with语法的话,还需加一句

from __future__ import with_statement

所以为了最大的兼容性,下面的示例使用装饰器来实现事务

autocommit()  ;

使用autocommit装饰器可以将view函数中的事务还原成Django默认的自动提交模式,无视全局事务的设置

from django.db import transaction

@transaction.autocommit

def viewfunc(request):

@transaction.autocommit(using="my_other_database")

def viewfunc2(request):

commit_on_success ()

顾名思义,view函数成功则提交事务,否则回滚用法同上

commit_manually ()

告诉Django我们将自己控制函数中的事务处理并且要注意,如果在视图函数中改变了数据库的数据并且没有调用commit() 或rollback(),那么将抛出TransactionManagementError异常

from django.db import transaction

@transaction.commit_manually

def viewfunc(request):

    # You can commit/rollback however and whenever you want

    transaction.commit()

    # But you've got to remember to do it yourself!

    except:

        transaction.rollback()

    else:

        transaction.commit()

@transaction.commit_manually(using="my_other_database")

def viewfunc2(request):

本文内容全部由Django官方文档翻译而来,参考资料是相关的文档如果要查看原文或是关于事务更多的细节(例如保存点),可以查阅。

参考资料:

Django官方文档关于事务的说明;中tFl

d使urself[;

dedha">发螜n>分类reDjango中的事务(Transaction)管箤的定接16" rel="bookmark定接re[;

v>
d使ursesori: 13.886363636364pt;ownria-labeoel="tegothm (6个项)">="tegothm d使ursesori: 9.9090909090909pt;ownria-labeoel=nalytopi (3个项)">=nalytopi d使ursesori: 14.681818181818pt;ownria-labeoel=rchit"reure (7个项)">=rchit"reure d使ursesori: 8pt;ownria-labeoel//bcktecin (2个项)">//bcktecin d使ursesori: 12.772727272727pt;ownria-labeoelc# (5个项)">c# d使ursesori: 8pt;ownria-labeoelcai (2个项)">cai d使ursesori: 8pt;ownria-labeoelcrawoll (2个项)">crawoll d使ursesori: 9.9090909090909pt;ownria-labeoeldbckll (3个项)">dbckll d使ursesori: 12.772727272727pt;ownria-labeoeldbclet (5个项)">dbclet d使ursesori: 9.9090909090909pt;ownria-labeoelflume (3个项)">flume d使ursesori: 8pt;ownria-labeoelgit (2个项)">git d使ursesori: 16.909090909091pt;ownria-labeoel-shaop (10个项)">-shaop d使ursesori: 12.772727272727pt;ownria-labeoel-taba (5个项)">-taba d使ursesori: 11.5pt;ownria-labeoel-iva (4个项)">-iva d使ursesori: 11.5pt;ownria-labeoel--.html d使ursesori: 11.5pt;ownria-labeoel--.ht5ml d使ursesori: 14.681818181818pt;ownria-labeoelt/ja (7个项)">t/jaml d使ursesori: 8pt;ownria-labeoelt/jadbc (2个项)">t/jadbcml d使ursesori: 12.772727272727pt;ownria-labeoeljs (5个项)">ji d使ursesori: 9.9090909090909pt;ownria-labeoellifa (3个项)">lifa d使ursesori: 9.9090909090909pt;ownria-labeoellinux (3个项)">linux d使ursesori: 13.886363636364pt;ownria-labeoellogsystem (6个项)">logsystem d使ursesori: 9.9090909090909pt;ownria-labeoelmaven (3个项)">maven d使ursesori: 9.9090909090909pt;ownria-labeoelmina (3个项)">mina d使ursesori: 8pt;ownria-labeoelmbck (2个项)">mbck d使ursesori: 13.886363636364pt;ownria-labeoelmysql (6个项)">mysql d使ursesori: 9.9090909090909pt;ownria-labeoelnetwork (3个项)">network d使ursesori: 8pt;ownria-labeoelnode.ji (2个项)">node.ji d使ursesori: 9.9090909090909pt;ownria-labeoelpig (3个项)">pig d使ursesori: 8pt;ownria-labeoelpowershell (2个项)">powershell d使ursesori: 8pt;ownria-labeoelscrapy (2个项)">scrapy d使ursesori: 11.5pt;ownria-labeoelsecuritym(4个项)">security d使ursesori: 18.022727272727pt;ownria-labeoelsoll (12个项)">soll d使ursesori: 9.9090909090909pt;ownria-labeoelspStri (3个项)">spStri d使ursesori: 21.363636363636pt;ownria-labeoelsql (20个项)">sql d使ursesori: 22pt;ownria-labeoelSQLServll (22个项)">SQLServll d使ursesori: 8pt;ownria-labeoelSSO (2个项)">SSO d使ursesori: 8pt;ownria-labeoelT4 (2个项)">T4 d使ursesori: 11.5pt;ownria-labeoeltestm(4个项)">test d使ursesori: 9.9090909090909pt;ownria-labeoelthn-re (3个项)">thn-re d使ursesori: 9.9090909090909pt;ownria-labeoeltipi (3个项)">tipi d使ursesori: 8pt;ownria-labeoelubuntu (2个项)">ubuntu d使ursesori: 9.9090909090909pt;ownria-labeoel (windi (3个项)"> (windi d使ursesori: 12.772727272727pt;ownria-labeoel (wSrv (5个项)"> (wSrv d使ursesori: 13.886363636364pt;ownria-labeoel ordeypre (6个项)"> ordeypre [;< 文(abbrl" title=enual Sicomp Syndplicati">RSSES;< RSSES;< "WordPre.w.o [ 28年六月 28年五月 28年四月 28年三月 28年二月 28年一月 27年十二月 27年十一月 27年十月 27年九月 27年八月 27年七月 27年六月 27年五月 27年四月 27年三月 26年十二月 26年十一月 26年九月 26年六月 26年五月 26年四月 26年三月 26年二月 25年十二月 25年十月 25年八月 25年七月 25年六月 25年五月 25年四月 25年三月 25年一月 24年十二月 24年十一月 24年十月 24年八月 24年七月 24年六月 24年五月 24年三月 24年二月 24年一月 23年十一月 23年十月 23年八月 23年七月 23年五月 23年四月 23年二月 23年一月 22年十二月 22年十一月 22年九月 22年八月 22年七月 22年六月 22年五月 22年四月 22年三月 22年二月 22年一月 21年十二月>