django的版本为:2.0
1 . 声明事务
from django.db import transaction
使用装饰器定义事务,在指定方法上进行修饰:
@transaction.atomic
def methond:
pass
2. 开启事务
tid = transaction.savepoint()
3. 提交事务
transaction.savepoint_commit(tid)
4. 回滚事务
transaction.savepoint_rollback(tid)
数据库中的原有记录为:
测试, 第一次不回滚:
@transaction.atomic
def put(self, request, uid=None):
r = Result()
a = 1
try:
# 开启事务
tid = transaction.savepoint()
user = User(id=uid)
user.username = "bingbing"
user.save()
raise Exception("出错了!")
transaction.savepoint_commit(tid)
except Exception as e:
#transaction.savepoint_rollback(tid)
r.error(e)
return self.s_result(r)
访问结果:
{
"code": -9,
"message": "出错了!",
"elapsed": 7
}
出错了,但是在数据库中仍然更新成功 !
接下来在exception里,添加回滚事务的方法:
transaction.savepoint_rollback(tid)
@transaction.atomic
def put(self, request, uid=None):
r = Result()
a = 1
try:
# 开启事务
tid = transaction.savepoint()
user = User(id=uid)
user.username = "bingbing"
user.save()
raise Exception("出错了!")
transaction.savepoint_commit(tid)
except Exception as e:
transaction.savepoint_rollback(tid)
r.error(e)
return self.s_result(r)
再次访问,访问结果:
{
"code": -9,
"message": "出错了!",
"elapsed": 7
}
数据库并没有更新成功! 还是原来的记录, 通过开启事务来保证了更新数据库的一致性,成功就更新, 失败就回滚 !