如果你花费了很多的时间去进行Django数据库事务处理的话,你将会了解到这是让人晕头转向的。
在过去,只是提供了简单的基础文档,要想清楚知道它是怎么使用的,还必须要通过创建和执行Django的事务处理。
这里有众多的Django事务处理的名词,例如:commit_on_success , commit_manually , commit_unless_maneged,rollback_unless_managed,enter_transaction_management,leace_transaction_management,这些只是其中的一部分而已。
最让人感到幸运的是,Django 1.6版本发布后。现在你可以紧紧使用几个函数就可以实现事务处理了,在我们进入学习这些函数的几秒之前。首先,我们要明确下面这些问题:
什么是事务处理呢? Django 1.6中的出现了那些新的事物处理优先权?在进入“要怎么才是Django 1.6版本中正确的事务处理”之前,请先了解一下下面的详细案例:
带状案例
事务
推荐的方式 使用分隔符 每一个HTTP请求事务保存点
嵌套的事务
事务是什么?
根据SQL-92所说,"一个SQL事务(有时简称为事务)是一个可以原子性恢复的SQL语句执行序列"。换句话说,所有的SQL语句一起执行和提交。同样的,当回滚时,所有语句也一并回滚。
例如:
# STARTnote = Note(title="my first note", text="Yay!")note = Note(title="my second note", text="Whee!")address1.save()address2.save()# COMMIT
所以一个事务是 数据库中单个的工作单元。它是由一个start transaction开始和一个commit或者显式的rollback结束。
Django 1.6之前的事务管理有什么问题?
为了完整地回答这个问题,我们必须阐述一下事务在数据库、客户端以及Django中是如何处理的。
数据库
数据库中的每一条语句都运行在一个事务中,这个事务甚至可以只包含一条语句。
几乎所有的数据库都有一个AUTOCOMMIT设置,通常它被默认设置为True。AUTOCOMMIT将所有语句包装到一个事务里,只要语句成功执行,这个事务就立即被提交。当然你也可以手动调用START_TRANSACTION,它会暂时将AUTOCOMMIT挂起,直到你调用COMMIT_TRANSACTION或者ROLLBACK。
然后,这种方式将会使AUTOCOMMIT设置的作用于每条语句后的隐式提交失效。
然而,有诸如像sqlite3和mysqldb的python客户端库,它允许python程序与数据库本身相连接。这些库遵循一套如何访问与查询数据库的标准。该DB API 2.0标准,被描述在PEP 249之中。虽然它可能让人阅读稍干一些。一个重要带走的是,在PEP 249状态之中,默认数据库应该关闭自动提交功能。
新闻热点
疑难解答