乐观锁是不对操作加锁,但是默认是加锁的?那乐观锁又是怎么实现的??
可以设置mysql对update这种语句不加锁么??

解决方案 »

  1.   

    乐观锁是要在程序代码实现的   对表加一个时间戳的列
    先select出来id和时间戳   然后再用id和时间戳来更新这行记录  
    如果未能更新 说明时间戳变动,已被人更改
      

  2.   

    我之前混淆了事务和锁的定义。
    以mysql为例:在乐观锁中设置的是自动提交的,也就是一个语句就是一个事务,至于事务级别可能是提交读或是未提交读也是可以的。
    基本步骤是:
    1.查询出商品信息
    select (status,status,version) from t_goods where id=#{id}
    2.根据商品信息生成订单
    3.修改商品status为2
    update t_goods 
    set status=2,version=version+1
    where id=#{id} and version=#{version};
    乐观锁中,上边的每一个语句就是一个小事务,select都是可以随便读的,只有在更新时检查。
    不知道是不是我理解的这样???希望指正
      

  3.   

    其实这个困惑是两件事, mysql对update语句加锁, 是保证了语句级别的原子性.
    而 乐观锁就是另一回事了, 举个例子:
    有一个商品表,有个字段 商品数量, 买了商品, 就把商品表里的数量减1, 增加库存就把数量加1. 
    那么有这么一个场景:  A(一个商家), B(一个消费者)
    A进了10件货,count = count+10
    B买了5件商品, count  = count -5.
    那么当这两件事一块来的时候, count 怎么保证事务性??
    乐观锁的实现是在update的时候,判断下version, version不对, 我再读一遍, count最终会一致的.