django中数据库事物的管理

事务(Transaction)是并发控制的基本单位。所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行。所以,应该把他们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。

在django1.8中事务的使用  注意:只要是已报异常,程序就自动回滚了。。

from django.db import transaction
#首先要导包
@transaction.atomic
@innerdef list(request):
    post= request.POST
    address = post.get('email')
    cart_id=post.getlist('cart_id')

    # 在调用一个view里面的方法之前,django开始一个事务如果发出的响应没有问题,
    # Django就会提交这个事务。如果在view这里产生一个异常,Django就会回滚这次事务
    # 开启事物保护
    sid = transaction.savepoint()
    try:
        # 1.建立新的订单信息
        # transaction.savepoint_commit(sid)  #事物的提交
        order = OrderInfo()
        now = datetime.now()
        uid = request.session['user_id']
        order.oid=('%s%d')%(now.strftime('%Y%m%d%H%M%S'), uid)  # 拼接字符代码
        order.user_id=uid
        order.udate = now
        order.oaddress = address
        print(order.oaddress,order.udate,order.user_id,order.oid,uid,now)
        order.otatal=0
        order.save()
        total=0  # 计算好的总价
        for cid in cart_id:
            cart=CartInfo.objects.get(pk=cid)
            # 2.判断库存,减少数据库库存
            if cart.goods.gkucun>=cart.count:
                cart.goods.gkucun-=cart.count
                cart.goods.save()         # 连表保存数据库的值
                # 把信息添加订单
                datail = OrderDetailInfo()
                datail.order=order        # 保存的外键对应ID
                datail.goods=cart.goods          #保存外键对应Id
                datail.price=cart.goods.gprice
                datail.count=cart.count
                # print(order,cart.goods,cart.goods.gprice)

                datail.save()
                # 计算总价
                total+=cart.goods.gprice*cart.count
                # 购车用完了删除
                cart.delete()
            else: # 购车数量比库存大
                transaction.savepoint_rollback(sid) #事务的回滚
                return redirect('/cart/')
        order.ototal = total
        print(total)
        order.save() # 计算完了 保存总价格
        transaction.savepoint_commit(sid) #提交事务的逻辑
        return redirect('/user/order/1')

    except :
        # 发生异常就回滚
        transaction.savepoint_rollback(sid)

 

posted @ 2017-06-08 21:42  严恩娜  阅读(1165)  评论(0编辑  收藏  举报