mysql表怎么加乐观锁_mysql数据库怎么设置乐观锁

乐观锁与悲观锁不同的是,它是一种逻辑上的锁,而不需要数据库提供锁机制来支持当数据很重要,

回滚或重试一次需要很大的开销时,需要保证操作的ACID性质,

此时应该采用悲观锁而当数据对即时的一致性要求不高,重试一次不太影响整体性能时,

可以采用乐观锁来保证最终一致性,同时有利于提高并发性通常,

乐观锁采用版本号/时间戳的形式实现:给数据额外增加一个版本号字段进行控制;

更新时,若提交的数据所带的版本号与当前记录的版本号一致,则允许变更执行并更新版本号;

若不一致,则意味着产生冲突,根据业务需求直接丢弃并返回失败,或者尝试合并在MySQL的实践中,

常见的一种使用乐观锁的方法,是在需要使用乐观锁的表中,

新增一个version字段例如:create table product_amount (id int not null primary key

auto_increment,product_name varchar(64) not null,selling_amount int not null,

storing_amount int not null,version int not null);

当需要更新销售中的商品数量(selling_amount)时,

使用如下的SQL语句:update product_amount set selling_amount = #{selling_amount},

version = #{new_version} where id=#{id} and version = #{old_version};

若该语句返回1,则表示更新成功;若返回0,则表示前后的version不一致,产生冲突,

更新失败对于更新仓库中的商品数据(storing_amount)时,也是同理不过,

这样为每行记录都统一设置一个version字段的乐观锁方式,

存在一个问题:上例中,如果同时需要单独对selling_amount及storing_amount进行update

(两条SQL语句分别单独执行),那么后执行的一条会因为先执行的一条更新了version字段而失败,

而这种失败显然是没有必要的,白白浪费了开销一种比较好的方式是为每个需要乐观锁的字段

单独设置版本号,例如对上例的改造:

create table product_amount (id int not null primary key auto_increment,

product_name varchar(64) not null,selling_amount int not null,

selling_version int not null,storing_amount int not null,

storing_version int not null);

selling_amount和storing_amount分别拥有自己的乐观锁版本号

(selling_version和storing_version),更新时分别只关注自己的版本号,

这样就不会因为版本号被其它字段修改而失败,提高了并发性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值