mysql锁
mysql innodb引擎 默认加共享锁 别人可以查,如果加排他锁 别人查都查不了,别说改了
共享锁的添加 : select * from table_name where ... LOCK IN SHARE MODE
排他锁的添加: select * from table_name where ... FOR UPDATE
表级锁
lock table app01_publish write; 锁住表 app01_publish 往里写
unlock tables 解锁
ORM 锁
ORM 排它锁,mysql 会默认加共享锁,锁一般都放在事务里
表名.objects.all().select_for_update
表锁 现在用不到
事务 会把某些sql语句捆绑起来
mysql语句开启事务 start transaction ; begin; 两种方式
commit 提交 roll back回滚
四大特性: 原子性 ,一致性,持久性,
隔离性: 事务执行5条sql语句,第三条的时候有人来查询了,他只能看到执行前的语句,看不到事务执行的过程,事务执行过程中会产生一些临时数据
一致性
持久性:数据会永久保存到磁盘上
原子性:事务执行过程不可分割
事务应用场景
支付 操作money 的几个人 钱是同时变化的
基金公司 基金转让 可以开启全局事务
全局开启事务
'DATABASE ={
ATOMIC_REQUESTS':True #全局开启事务,绑定的是http请求响应的整个过程
}
请求来 --> 视图 orm语句--> 在http请求流程过程中被捆绑成了一个事务
全局事务开启,使用装饰器取消事务
from django.db.models import transaction
当前视图函数取消事务
@transaction.non_atomic_requests
def my_view(request):
do_stuff()
给其他视图函数取消事务
@transaction.non_atomic_requests(using = 'other')
def my_other_view(request):
do_stuff_on_the_other_database()
2.局部加事务
1.给视图函数装饰器加事务,视图函数中的所有sql语句被捆绑成一个事务
from django.db.models import transaction
@transaction.atomic(原子的意思)
def viewfunc(request):
do stuff()
2.作为上下文管理器来使用,其实就是设置事务的保存点
from django.db.models import transaction
def viewfunc(request):
do_stuff() //做一些事情
with transaction.atomic();
do more_stuff()//在with语句里边加事务
do other_stuff() //
事务使用方式
放到mysql存储过程中,或者放入python 文件中(脚本)
原生sql可以捕获异常,写一个异常捕获
当 sql语句执行出错,出现异常了,可以rollback 回滚到数据执行前
如果没有异常 直接commit;