[Django学习]事务处理
其实事务处理已经在 django 中提供了,可是很奇怪好象没有过多的“笔墨”来讲明这个事。今天看了看,真是很是简单。具体的在 django 所带的 transaction 文档中。
django对于事务的支持分几个层次。
1. 什么都无论的话,它是使用 autocommit 方式。也就是在执行了 save() 或 delete() ,等修改数据库的语句以后就自动提交了。
2. 经过增长 Transaction 中间件来实现自动的事务支持。我感受这个是很是方便的作法。使用它,你首先须要在 settings.py 中增长一个中间件的设置:
MIDDLEWARE_CLASSES = (
"django.middleware.common.CommonMiddleware",
"django.middleware.sessions.SessionMiddleware",
"django.middleware.cache.CacheMiddleware",
"django.middleware.transaction.TransactionMiddleware",
)
但要注意,这个设置与其它的中间件的顺序是有关的。因此置于 TransactionMiddleware 以后的中间件也将受事务的控制。所以,若是把 session 中间件放在 Transaction 以后,它也会受到影响。不过文档上说 Cache 没有关系,由于它使用自已内部的数据库处理。
那么只要设置这个中间件以后,事务机制就自动生效了。你不须要在 View 代码中作特殊的处理。只要一个 View 在 Response 返回成功,事务就自动提交。一旦出现异常,事务就回滚。太方便了。所以 Woodlog 中我只加了这么个设置,其它的我都没有动。并且我测试了一下,故意引起一个异常,数据并无真实插入
3. 自已来控制事务
若是你不喜欢 django 为你实现的这种事务方式,你还能够自已来控制事务,这时你能够不安装 TransactionMiddleware中间件了。基本上都是经过 decorator 来实现的,即在每一个View函数前加上decorator的修饰。好比:
@transaction.autocommit
就是实现了缺省状态的事务处理,即碰上 save() 或 delete() 就自动提交。
@transaction.commit_on_success
当整个view成功后提交事务,不然回滚,这与 TransactionMiddleware提供的方式是同样的。
@transaction.commit_manually
这是最手动的方式。你须要显示地调用commit或rollback。
具体的例子参见 Transaction 文档。
同时 Django 能够容许你在 settings.py 设置 DISABLE_TRANSACTION_MANAGEMENT 为 True 来禁止事务处理。这样在你须要时你能够自已来进行控制事务。
感受 TransactionMiddleware 的使用真是方便啊。数据库