我之前混淆了事务和锁的定义。 以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都是可以随便读的,只有在更新时检查。 不知道是不是我理解的这样???希望指正
先select出来id和时间戳 然后再用id和时间戳来更新这行记录
如果未能更新 说明时间戳变动,已被人更改
以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都是可以随便读的,只有在更新时检查。
不知道是不是我理解的这样???希望指正
而 乐观锁就是另一回事了, 举个例子:
有一个商品表,有个字段 商品数量, 买了商品, 就把商品表里的数量减1, 增加库存就把数量加1.
那么有这么一个场景: A(一个商家), B(一个消费者)
A进了10件货,count = count+10
B买了5件商品, count = count -5.
那么当这两件事一块来的时候, count 怎么保证事务性??
乐观锁的实现是在update的时候,判断下version, version不对, 我再读一遍, count最终会一致的.