ORM锁和事务
行级锁
在写表的: 增删改语句-搜索引擎innodb自动加行级锁
查询语句加锁(默认不加锁):
models.Book.objects.select_for_update().filter(id=1)
# select * from app01_book where id=1 for update; #sql语句手动加锁
事务
四大特性:原子性(不可分割),一致性,隔离性,持久性
原子性(不可分割): 最主要的
多条sql语句,捆绑到一起执行,要么全部成功,要么全部失败(例如:支付宝转账)
一致性:
数据修改前后数据保持一致(支付宝转账,我收100元,你就减100元)
隔离性:
两个事务之间执行过程是隔离的,互不影响
持久性:
数据改动上传到硬盘上,硬盘上的数据就保存修改后的内容了
特点:
事务中的sql语句,如果加锁了,事务不提交,锁永不释放;事务提交后,锁才释放
mysql中开启事务:
begin 或者 start transaction
mysql中提交事务:
commit
事务中加锁:
自己提取是数据,再我没改完,别人休想在动,保证了数据的一致性;否则,我没改完,就被别人改了,数据就乱了
方式1: 视图函数中加事务
from django.db import transaction
# 视图中的所有orm或者sql语句都捆绑为了一个事务
@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(): #给函数中的一部分语句加事务,with里边的代码在事务内执行
models.Book.objects.select_for_update().filter(id=1)
do_more_stuff()
do_other_stuff()