商品分类-商品详情-数据库脏读-不可重复读-幻读-订单生成

商品详情的无限极分类

  --北京

    --朝阳区
  ---上海

    --松江
      --大学城
def get_level(data):
    data_list=[]
    for item in data:
        if item[‘parent_id‘]==0:
            item[‘level‘]=0
        else:
            item[‘level‘]=1
        data_list.append(item)
    return data_list

data=[
    {"cat_id":1,"name":"北京","parent_id":0},
    {"cat_id":2,"name":"上海","parent_id":0},
    {"cat_id":3,"name":"沙河","parent_id":1},
    {"cat_id":4,"name":"sb镇","parent_id":3},
    {"cat_id":5,"name":"昌平","parent_id":1},
    {"cat_id":6,"name":"青浦","parent_id":2},
]
def get_tree(data):
    lists=[]
    tree={}
    for i in data:
        tree[i[‘cat_id‘]]=i
    for item in data:
        if not item[‘parent_id‘]:
            lists.append(tree[item[‘cat_id‘]])
        else:
            if "children" not in tree[item[‘parent_id‘]]:
                tree[item[‘parent_id‘]][‘children‘]=[]
            tree[item[‘parent_id‘]][‘children‘].append(tree[item[‘cat_id‘]])
    return lists
# print(get_tree(data))
res=[]
def get_son(data,level=0,parent_id=0,is_clear=True):
    if is_clear:
        res.clear()
    for item in data:
        if item[‘parent_id‘]==parent_id:
            item[‘level‘]=level
            res.append(item)
            get_son(data,level=level+1,parent_id=item[‘cat_id‘],is_clear=False)
    return res
# son=get_son(data)
# for i in son:
#     print("-"*i[‘level‘]+i[‘name‘])
# 1北京 0
#     2-海淀1
#         4--sb镇2
#     -昌平
# 3 上海 0
#     -青浦
#     --徐泾镇
#     -闵行
res_id=[]
def get_son_id(data,parent_id=0,is_clear=True):
    if is_clear:
        res_id.clear()
        if parent_id :
            res_id.append(parent_id)

    for item in data:
        if item[‘parent_id‘]==parent_id:
            res_id.append(item[‘cat_id‘])
            get_son(data,parent_id=item[‘cat_id‘],is_clear=False)
    return res_id

import time ,random
def get_order_id():
    st="012345679qwertyui"
    order_id=str(time.strftime("%Y%m%d%h%M%S"))+"".join(random.sample(st,5))
    return order_id

商品分类列表

前端部分

后端

class List(APIView):
    def post(self,request):
        param=request.data
        if param.get(‘category_id‘):
            data=models.Category.objects.filter(is_show=True)
            data=Category_ser.Category_ser(instance=data,many=True,context={"request":request}).data
            all_id=func.get_son_id(data,param[‘category_id‘])
            data=models.Product.objects.filter(disabled=True,cat_id__in=all_id).order_by("-w_order")
            data = Goods_ser.Goods_ser(instance=data, many=True, context={"request": request}).data
            return Response({"code": 200, "msg": "ok", "data": data})
        else:
            return Response({"code": 201, "msg":"缺少参数" })

商品详情

class Detail(APIView):
    def post(self,request):
        param=request.data
        if param.get("id"):
            data = models.Product.objects.filter(disabled=True,product_id=param.get("id")).first()
            if data:
                data = Goods_ser.Goods_ser(instance=data, many=False, context={"request": request}).data
                print(data)
                return Response({"code": 200, "msg": "ok", "data": data})
            else:
                return Response({"code": 201, "msg": "没有该商品"})

前端

<import src="../../wxParse/wxParse.wxml" />
<navigation id=‘Navigation‘ show-icon="{{true}}" title="商品详情" show-title="{{true}}" class=""></navigation>
<view class="container">

  <view class="swiper-container">

          <image src="{{goodsDetail.image_url}}" class="slide-image" lazy-load="true" />
  </view>
  <view class="goods-info">
    <view class="goods-left">
      <view class="goods-title">{{goodsDetail.name}}</view>
      <view class="goods-characteristic">{{goodsDetail.intor}}</view>
        <view class="goods-price">? {{goodsDetail.price}}</view>
        <view class="piangjia">
          已售 {{goodsDetail.buy_count}}
        </view>
    </view>
  </view>
  <view class="tab-header" bindtap="tabFun">
    <view class="{{tabArr.curHdIndex==‘0‘? ‘active‘ : ‘‘}}" id="tab-hd01" data-id="0">商品介绍</view>
    <view class="{{tabArr.curHdIndex==‘1‘? ‘active‘ : ‘‘}}" id="tab-hd02" data-id="1">商品评价</view>

  </view>
  <view class="tab-container">
    <view class="tab-item {{tabArr.curBdIndex==‘0‘? ‘active‘ : ‘‘}}">
      <view class="goods-text">
        <template is="wxParse" data="{{wxParseData:article.nodes}}" />
      </view>
    </view>
    <view class="tab-item {{tabArr.curBdIndex==‘1‘? ‘active‘ : ‘‘}}">
      <view class="reputation-none" wx:if="{{!reputation}}">
        <image src="../../images/empty_comment.png" /> 还没有人评价
      </view>
      <view class="goods-reputa-list" wx:for="{{reputation}}" wx:key="id">
        <view class="goods-reputa-avatar">
          <image class="goods-avatar" src="{{item.user.avatarUrl}}"></image>
        </view>
        <view class="goods-reputa-mark">
          <view class="goods-reputa-user">
            {{item.user.nick}}
            <text>{{item.goods.goodReputationStr}}</text>
          </view>
          <view class="goods-mark">{{item.goods.goodReputationRemark}}</view>
          <view class="goods-mark-day">
            {{item.goods.dateReputation}}
            <text>{{item.goods.property}}</text>
          </view>
        </view>
      </view>
    </view>
  </view>

    <view class="footer-box">
      <view class="box-list">
        <image src="../../images/goods_service.png"></image>
        <button open-type="contact" session-from="weapp"></button>
      </view>
      <view class="box-list" bindtap="goShopCar">
        <image src="../../images/shopping_cart.png"></image>
        <view class="shop-num">{{shopNum}}</view>
      </view>
      <view class="box-list" >

      </view>
      <view class="box-title">
        <view class="box-shop-cart npx" bindtap="tobuy">立即购买</view>
      </view>
      <view class="box-title buy-now">
        <view class="box-now-buy npx" bindtap="toAddShopCar">加入购物车1</view>
      </view>
    </view>

  <view class="show-popup" hidden="{{hideShopPopup}}">
    <view class="popup-mask" bindtap="closePopupTap"></view>
    <view class="popup-contents">
      <view class="pop-goods-info">
        <view class="pop-img-box">
          <image src="{{goodsDetail.image_url}}" class="goods-thumbnail" />
        </view>
        <view class="pop-goods-des">
          <view class="pop-goods-title">{{goodsDetail.name}}</view>
          <view class="pop-goods-price" >¥ {{goodsDetail.price}}</view>

        </view>
        <view class="pop-goods-close" bindtap="closePopupTap"></view>
      </view>

      <view class="buy-num-box">
        <view class="num-label">购买数量</view>
        <view class="num-box">
          <view class="num-jian {{buyNumber == buyNumMin ? ‘hui‘: ‘‘}}" bindtap="numJianTap">-</view>
          <view class="num-input">
            <input type="number" value="{{buyNumber}}" disabled/>
          </view>
          <view class="num-jia {{buyNumber== buyNumMax ? ‘hui‘: ‘‘}}" bindtap="numJiaTap">+</view>
        </view>
      </view>
      <view class="popup-join-btn" wx:if="{{shopType ==‘addShopCar‘}}" bindtap="addShopCar">加入购物车</view>
      <view class="popup-join-btn" wx:if="{{shopType ==‘tobuy‘}}" bindtap="buyNow"> 立即购买</view>

    </view>
  </view>
</view>

事务的隔离级别

  事务的四大特性分别是:原子性、一致性、隔离性、持久性

解释

"""
原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
一致性: 执行事务前后,数据保持一致;
隔离性: 并发访问数据库时,一个用户的事物不被其他事物所干扰,各并发事务之间数据库是独立的;
持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

"""

并发事务带来的问题

  在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对统一数据进行操作)。

并发虽然是必须的,但可能会导致一下的问题。

脏读(Dirty read):

   事务T1正在操作一条数据,此时事务T2获取该条数据纪录,如果T1异常,事务回滚,T2读取到的数据就是脏数据,这种现象称为脏读。

不可重复读(Unrepeatableread):

   事务T1多次读取某条记录,在读取间隔中,事务T2更新了该技术的数据,当T1再次读取该记录时,获取到的数据不一致,这种现象称为不可重复读。产生的原因主要是数据的更新。

幻读(Phantom read):

  幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,

第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。

可重复读(Repeatable read):

   ①定义:就是一个事务对同一份数据读取到的相同,不在乎其他事务对数据的修改。MySQL默认的隔离级别。

   ②缺点:会产生幻读。

序列化(Serializable)

①定义:事务串行化执行,隔离级别最高,牺牲了系统的并发性。

②缺点:可以解决并发事务的所有问题。但是效率地下,消耗数据库性能,一般不使用。

乐观锁和悲观锁

概念

#悲观锁:总是假设最坏的情况,认为竞争总是存在,每次拿数据的时候都认为会被修改,因此每次都会先上锁。其他线程阻塞等待释放锁。

#乐观锁:总是假设最好的情况,认为竞争总是不存在,每次拿数据的时候都认为不会被修改,因此不会先上锁,在最后更新的时候比较数据有无更新,可通过版本号或CAS实现。

两种锁的使用场景

悲观锁:用于写比较多的情况,避免了乐观锁不断重试从而降低性能。
乐观锁:用于读比较多的情况,避免了不必要的加锁的开销。

  

  

  

原文地址:https://www.cnblogs.com/Gaimo/p/11827857.html

时间: 2024-10-27 13:21:08

商品分类-商品详情-数据库脏读-不可重复读-幻读-订单生成的相关文章

mysql事务隔离级别/脏读/不可重复读/幻读详解

一.四种事务隔离级别 1.1 read uncommitted 读未提交 即:事务A可以读取到事务B已修改但未提交的数据. 除非是文章阅读量,每次+1这种无关痛痒的场景,一般业务系统没有人会使用该事务隔离级别,标准实在太宽松了. 1.2 read committed 读已提交(简称RC) 即:事务A只能读取到事务B修改并已提交的数据. 这个级别相对要严格一些,至少是要等其它事务把变更提交到db,才能读取到,听上去蛮靠谱的.但是有些业务场景,比如会员系统中,如果要在一个事务中,多次读取用户身份,判

数据库并发导致的脏读 不可重复读 幻读的处理方法

在做ERP订单接入仓库库存的时候出现了一个问题.下单会读取该商品是否有库存.如果有那么就下单 减去(可下单库存,物理库存不变) 没有则提示库存不足 在并发情况下就会导致 u1用户下单编号为1的商品1个  u2用户也下单编号为1的商品1个.编号为1的商品库存只有1个. 那么当u1在读取出数据的时候发现库存有一个 但是还没有写入库存的操作   u2也下单成功并提交  那么就会导致数据错乱 本来应该是只有u1会下单成功u2则提示库存不足 这里可以用事物的隔离机制或乐观锁来解决 事物是一个逻辑单元 原子

[MySQL]对于事务并发处理带来的问题,脏读、不可重复读、幻读的理解与数据库事务隔离级别 - 分析脏读 &amp; 不可重复读 &amp; 幻读

刚开始写博客.. 写的太low. 1.数据库的两种读,每种读读的数据版本不一样,所以也称为MVCC,即多版本并发控制 a) 快照读 select * from where xxx  这种形式的都是快照读. b) 当前读 update , insert ,delete ,select xx from xx for update ,  in share mode 都是当前读 当前读会等待,不会返回数据的历史版本 2.mvcc 的实现原理 mvcc是基于read view.活跃事务列表 做的,以后的文

理解数据库事务隔离级别以及脏读, 不可重复读, 幻读(转)

  转自:http://blog.csdn.net/sunxing007/article/details/6427290 数据库事务的4个特性: 原子性(atomic): 都成功或者都失败: 一致性(consistency):事务操作之后,数据库所处的状态和业务规则是一致的;比如a,b账户相互转账之后,总金额不变: 隔离性(isolation):操作中的事务不相互影响; 持久性(durability):事务提交后被持久化到数据库. 脏读,不可重复读, 幻读 幻读phantom read:事务1读

数据库事务隔离级别 - 分析脏读 &amp; 不可重复读 &amp; 幻读

一 数据库事务的隔离级别 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted .Read committed .Repeatable read .Serializable ,这四个级别可以逐个解决脏读 .不可重复读 .幻读这几类问题. 1. Read UnCommitted(读未提交) 最低的隔离级别.一个事务可以读取另一个事务并未提交的更新结果. 2. Read Committed(读提交) 大部分数据库采用的默认隔离级别.一个事务的更新操作结果只有在该事务提交之后,另

脏读 不可重复读 幻读

脏读(Dirty Read)     脏读意味着一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚 不可重复读(Unrepeatable Read) 不可重复读意味着,在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据.这是由于查询时系统中其他事务修改的提交而引起的. 例如:事务B中对某个查询执行两次,当第一次执行完时,事务A对其数据进行了修改.事务B中再次查询时,数据发生了改变 幻读(phantom read) 幻读,是指当事务不是独立执行时发生的一种现象,例如第一个事务对

脏读 不可重复读 幻读以及第一、二类丢失更新

http://blog.csdn.net/gaoshan_820822/article/details/4582561 脏读(Dirty Read) 脏读意味着一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚. 不可重复读(Unrepeatable Read) 不可重复读意味着,在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据.这是由于查询时系统中其他事务修改的提交而引起的. 例如:事务B中对某个查询执行两次,当第一次执行完时,事务A对其数据进行了修改.事务B中再次查询时

了解数据库中脏读+不可重复读+幻影读

"读现象"是多个事务并发执行时,在读取数据方面可能碰到的状况.先了解它们有助于理解各隔离级别的含义.其中包括脏读.不可重复读和幻读. 脏读: 脏读又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的. 脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交(commit)到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据.因为这个数据是还没有提交

数据库事务隔离级别、脏读、重复读、不可重复读、幻读

数据库事务四种隔离级别 1.Read Uncommitted(读未提交) :事务中的修改,即使没有提交,其他事务也可以看得到,会导致“脏读”.“幻读”和“不可重复读取”. 2.READ COMMITTED (读提交):大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”,但不能避免“幻读”和“不可重复读取”.该级别适用于大多数系统. 3.REPEATABLE READ(可重复读) :保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的