django mysql 加锁_Django-事务和锁

一、事务

1、全局开启事务

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

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

DATABASES ={'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'mxshop','HOST': '127.0.0.1','PORT': '3306','USER': 'root','PASSWORD': '123','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 importtransaction

@transaction.atomicdefviewfunc(request):#This code executes inside a transaction.

do_stuff()

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

from django.db importtransactiondefviewfunc(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 forupdate

models.T1.objects.select_for_update().filter(id=1) #排他锁(互斥锁) 读写不行写也不行

三、MySQL中加锁和事务

83e2654065128a845a7ba2b7f8ab22be.png

MySQL默认自动commit,

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

事务:

0a3dcbbf5052bc0cc9bc0ff1772c0a4a.png

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

13a9a9137af4825216eb3f5960f3ebd8.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值