一、事务

1、全局开启事务

在Web应用中,常用的事务处理方式是将每个请求都包裹在一个事务中。这个功能使用起来非常简单,你只需要将它的配置项ATOMIC_REQUESTS设置为True。

它是这样工作的:当有请求过来时,Django会在调用视图方法前开启一个事务。如果请求却正确处理并正确返回了结果,Django就会提交该事务。否则,Django会回滚该事务。

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mxshop',
'HOST': '127.0.0.1',
'PORT': '',
'USER': 'root',
'PASSWORD': '',
'OPTIONS': {
"init_command": "SET default_storage_engine='INNODB'",
       #'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", #配置开启严格sql模式 }
"ATOMIC_REQUESTS": True, #全局开启事务,绑定的是http请求响应整个过程
# "AUTOCOMMIT":False, #全局取消自动提交,慎用
},
  'other':{
    'ENGINE': 'django.db.backends.mysql',
......
  } #还可以配置其他数据库
}

2、局部使用事务

原子性是数据库事务的一个属性。使用atomic,我们就可以创建一个具备原子性的代码块。一旦代码块正常运行完毕,所有的修改会被提交到数据库。反之,如果有异常,更改会被回滚。

被atomic管理起来的代码块还可以内嵌到方法中。这样的话,即便内部代码块正常运行,如果外部代码块抛出异常的话,它也没有办法把它的修改提交到数据库中。

用法1:给函数做装饰器来使用

from django.db import transaction

@transaction.atomic
def viewfunc(request):
# This code executes inside a transaction.
do_stuff()

用法2:作为上下文管理器来使用,其实就是设置事务的保存点

from django.db import transaction

def viewfunc(request):
# This code executes in autocommit mode (Django's default).
do_stuff() with transaction.atomic(): #保存点
# This code executes inside a transaction.
do_more_stuff() do_other_stuff()

二、锁

select_for_update()
select * from t1 for update
models.T1.objects.select_for_update().filter(id=1) #排他锁(互斥锁) 读写不行写也不行

三、MySQL中加锁和事务

MySQL默认自动commit,
验证锁,先把自动commit取消;

事务:

开启一个事务,必须我们手动commit,这个事务才会结束:

最新文章

  1. 萌新笔记——linux下查看内存的使用情况
  2. PPT演示快捷键
  3. Python学习路程day18
  4. 【BZOJ2793】【数学】[Poi2012]Vouchers
  5. linux中轻松使用backspace和上下按键
  6. maven mirror
  7. underscorejs-where学习
  8. java读取配置文件的几种方法
  9. pprint模块解析
  10. Android Activity和Intent机制学习笔记
  11. strus2 action重复执行问题
  12. ORM映射设计思想
  13. SecureCRT + Tmux 分屏 高效开发
  14. Toggle Slow Animations
  15. Mysql 查看连接数,状态 最大并发数(赞)
  16. logging模块、sys模块、shelve模块
  17. /dev/null 2>&1 什么意思
  18. MySQL库中表名忽略大小写设置的影响
  19. angular、jquery、vue 的区别与联系
  20. PHP中CGI,FastCGI,PHP-CGI与PHP-FPM对比

热门文章

  1. Vasya's Function CodeForces - 837E (gcd)
  2. codeblocks 使用汇总
  3. jQuery 手写菜单(ing)
  4. 微信小程序转发事件
  5. elementui-插槽
  6. 行内块和文字垂直对齐vertical-agign
  7. django 权限控制精简版
  8. Unexpected token '...'. Expected a property name.
  9. 三台服务器的时间同步-Linux
  10. 面向对象(OPP)的三大特征之 继承