ORM中的锁和事务
锁
sql语句加锁
select * from book where id=1 for update;
begin;
start transaction;
select * from t1 where id=1 for update;
commit
rollback;
django orm
models.Book.objects.select_for_update().filter(id=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',
......
} #还可以配置其他数据库
}
局部事务
用法1
视图中所有的orm都加上了事务
from django.db import transaction
@transaction.atomic
def viewfunc(request):
pass #此视图中所有的orm都加上了事务
用法2:
作为上下文管理器来使用,其实就是设置事务的保存点
视图的某个部分使用
from django.db import transaction
def viewfunc(request):
do_stuff()
with transaction.atomic(): #保存点
do_more_stuff()
do_other_stuff()
用法3:还可以嵌套使用,函数的事务嵌套上下文管理器的事务,上下文管理器的事务嵌套上下文管理器的事务等。下面的是函数嵌套上下文的例子:
from django.db import IntegrityError, transaction
@transaction.atomic
def viewfunc(request):
create_parent()
try:
with transaction.atomic():
generate_relationships()
#other_task() #还要注意一点,如果你在事务里面写了别的操作,只有这些操作全部完成之后,事务才会commit,也就是说,如果你这个任务是查询上面更改的数据表里面的数据,那么看到的还是事务提交之前的数据。
except IntegrityError:
handle_exception()
add_children()
热爱技术,享受生活,感谢推荐!