django使用mysql事务处理_使用Django进行事务管理

本文介绍了Django 1.6之前的事务管理问题及其复杂性,然后详细讨论了在Django 1.6中如何使用简单的事务管理,包括条纹示例、推荐的事务管理方式、使用装饰器、每个HTTP请求的事务、存盘点和嵌套事务。文章以一个注册功能为例,展示了如何正确处理事务,确保数据一致性。
摘要由CSDN通过智能技术生成

原标题:使用Django进行事务管理

358818e05bc8edc01ab5e0c8201cea0a.gif

Python部落组织翻译,禁止转载,欢迎转发

如果你曾经花大量时间学习过Django数据库事务管理,你就会知道学习它是多么的令人迷惑。在过去,官方提供的辅助文档具有相当的深度,但是理解它只能通过建立数据库和做实验。

有过多的修饰词来说明这一点,像,commit_on_success, commit_manually,commit_unless_managed, rollback_unless_managed, enter_transaction_management,leave_transaction_management, 我在这里仅仅说明几个例子。幸运的是,通过使用Django 1.6,这些都不再成为问题。所以你现在真的需要只需要一些函数。并且我们可以很快就会学到这些。首先,我们将会重点讲解这些话题:

什么是事务管理?

在Django 1.6之前事务管理是怎么样的?

在深入之前:

在Django 1.6中关于事务管理什么是对的?

然后解决一些详细的例子:

条纹示例

事务

推荐的方式

使用装饰器

每种HTTP请求的事务

存盘点

嵌套事务

什么是事务?

根据SQL-92,“一个SQL事务(有时简称为事务)是一系列SQL语句的执行”。换句话讲,所有的SQL语句是在一块执行的。同样的,当需要回滚的时候,所有的语句会一起进行回滚执行。

例如:

# START note = Note(title="my first note", text="Yay!")

note = Note(title="my second note", text="Whee!")

address1.save()

address2.save()

# COMMIT

因此,事务就是数据库中的单个单元的工作。并且这个单个单元的工作是通过一个起始事务进行划分,然后进行或者回滚。

在Django 1.6之前事务管理是怎么样的?

为了充分地这个问题,我们必须解决事务在数据库、客户端和Django中是如何处理的。

数据库

数据库中的每一个语句必须在事务中运行,即使事务仅仅包括一个语句。

大多数的数据库都有AUTOCOMMIT设置,这个设置通常默认设置为真。这个AUTOCOMMIT覆盖了事务中的每一个语句,如果语句执行成功的话,就 会立即执行。当然了,你可以调用像START_TRANSACTION的语句,这个语句将会暂时停止AUTOCOMMIT,直到你调用 COMMIT_TRANSACTION或ROLLBACK。

但是,这里的缺点就是AUTOCOMMIT设置会在每一个语句之后应用一个隐含的执行。

客户端

有像sqlite3和mysqldb这样的客户端,可以将Python程序与数据库本身进行连接。这样的客户端具有一系列的用于获取和查询数据库的标准。 DB API 2.0标准在PEP 249中进行了描述。这个标准数据库可能阅读起来比较枯燥,一个重要的问题就是PEP 249表明数据库 AUTOCOMMIT应该是默认为OFF.

这就和数据中的一些情况发生了冲突:

SQL语句总是必须在事务中运行,数据库一般是通过AUTOCOMMIT对你开放。

然而,根据PEP 249,这个不应该发生。

客户端必须面对数据库中发生的情况,但是因为他们不允许将AUTOCOMMIT默认转换成on,他们就像在数据库中仅仅在事务中包括你的SQL语句。

好的。和我呆在一起久一点吧。

Django

进入到Django. Django和事务管理之间也有很多可以探讨的。在Django 1.5和之前的版本中,Django基本上是以开放事务运行,并且当你写数据到数据库时会自动执行相应的事务。所以每次当你调用函数 model.save()或者model.update()时,Django就会产生合适的SQL语句,然后执行对应的事务。

并且在Django 1.5和之前的版本中,推荐使用TransactionMiddleware来绑定事务到HTTP请求中。每一个请求都会给出一个事务。如果响应没有例外 的返回,Django将会执行这个事务,但是如果你的回调函数抛出了一个错误,ROLLBACK将会调用。这实际上会关掉AUTOCOMMIT。如果你想 要标准,数据库级的自动执行方式的事务管理,你必须管理这些事务本身——通常在你的回调函数中采用事务装饰器,比如 @transaction.commit_manually或@transaction.commit_on_success。

休息一下。

那这意味着什么呢?

是的,那里还有很多事情可以去做,并且它证明了大多数的开发者只是想要标准数据库级的自动执行,也就是说事务一直都在幕后,做着它们的事情,直到你需要人工去调整它们。

在Django 1.6中关于事务管理为什么是对的?

现在,欢迎来到Django 1.6。尽力忘记刚才我们探讨过的所有东西,仅仅记得在Django 1.6中,你可以使用数据库AUTOCOMMIT语句,并且当需要的时候可以手动管理事务。从本质上讲,我们拥有一个非常简单的模型,基本上首先是做数据库是如何设计的。

理论已经足够了。让我们开始编写代码吧。

条纹示例

这里我们采用这个例子来观察函数如何处理登记用户和采用Strip进行信用卡处理。

def register(request):

user = None

if request.method == &

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值