内蒙古住房和城乡建设网站,网站建站网站域名申请,wordpress手机模板怎么用,酷家乐装修设计官网2019-01-08 回答乐观锁与悲观锁不同的是#xff0c;它是一种逻辑上的锁#xff0c;而不需要数据库提供锁机制来支持当数据很重要#xff0c;回滚或重试一次需要很大的开销时#xff0c;需要保证操作的acid性质#xff0c;此时应该采用悲观锁而当数据对即时的一致性要求不高…2019-01-08 回答乐观锁与悲观锁不同的是它是一种逻辑上的锁而不需要数据库提供锁机制来支持当数据很重要回滚或重试一次需要很大的开销时需要保证操作的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)更新时分别只关注自己的版本号这样就不会因为版本号被其它字段修改而失败提高了并发性