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

回滚或重试一次需要很大的开销时,需要保证操作的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),更新时分别只关注自己的版本号,

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

mysql设置乐观锁_mysql数据库怎么设置乐观锁相关推荐

  1. MySQL延时更改数据_mysql数据库备份设置延时备份方法(mysql主从配置)

    一 为什么需要延时备份 percona-xtrabackup是一个优秀的用于增量备份的工具.今天我们讲到的延时备份也是使用他们的产品. 以前在MySQL AB复制一文中提到了AB复制.我们首先回顾下M ...

  2. mysql sql 字段唯一_MySQL数据库唯一性设置(unique index)

    我们知道在数据库设计中设置成主键的字段是不会重复的.唯一的,但如果有其他字段也需要保持唯一性应该如何设置呢?比如一个保存学生信息的表里要保证每条记录的学号都不同.这时候就需要对该字段设置唯一性. 设置 ...

  3. 数据库助手连接MySQL设置_数据库简易设置助手下载_数据库简易设置助手官方版下载_3DM单机...

    <数据库简易设置助手>是一款数据库配置工具,能够高效便捷对数据库进行管理工作,他支持一件关闭开启数据库,并能够设置服务启动类型,支持一键设置jdk环境,支持系统中安装多个版本的JDk环境, ...

  4. mysql数据库的远程访问_mysql数据库远程访问设置方法

    mysql数据库远程访问设置方法 myeclipse连接mysql数据库错误示例: null, message from server: "Host '127.0.0.1' is not a ...

  5. mysql 事务 不同库_MYSQL数据库重点:事务与锁机制

    一.事务 一组连续的数据库操作,每一次操作都成功,整个事务就成功,只要有一步出错,整个事务就失败: MySQL事务与存储引擎相关 1.MyISAM:不支持事务,用于只读程序提高性能 2.InnoDB: ...

  6. mysql 子查询 共享锁_MySQL数据库排他锁与共享锁

    导语:"简单印象"头条号每天将不定时发布一篇文章,文章内容大多为原创性技术相关或技术人的另一面生活,欢迎大家收藏文章或点击右上角的"关注",支持我的头条号,也可 ...

  7. mysql 全局select授权_MySQL的用户设置与授权

    你可以有2个不同的方法增加用户:通过使用GRANT语句或通过直接操作MySQL授权表  .比较好的方法是使用GRANT语句,因为他们是更简明并且好像错误少些  . 使用SHOW GRANTS语句显示用 ...

  8. mysql查看当前字符集_Mysql 查看字符集设置

    MySQL 乱码的根源是的 MySQL 字符集设置不当的问题,本文汇总了有关查看 MySQL 字符集的命令.包括查看 MySQL 数据库服务器字符集.查看 MySQL 数据库字符集,以及数据表和字段的 ...

  9. mysql 备份的权限_MySQL的权限设置和备份还原

    MySQL数据库系统的维护工作主要包括用户权限的设置.数据库的备份与恢复,本篇博客将对进行这些操作进行讲解 数据库的用户授权 MySQL数据库的root用户账号拥有对所有库.表的全部权限,频繁使用ro ...

最新文章

  1. FSWD_1_BasicHtmlCss
  2. python中四种进制的输出_Python基础语法和进制
  3. 简单选择排序 c代码
  4. Java split(“\\s+“) 和 split(“+“) 有什么区别
  5. [architecture]-AMBA AXI AHB APB学习总结
  6. android byte转16进制字符串,如何将字节数组转换为十六进制字符串,反之亦然?...
  7. 《陶哲轩实分析》部分勘误
  8. iOS13 已越狱 iOS12.4 已越狱
  9. JS 原生实现复选框全选反选功能
  10. 【收集】C#一些基础的面试题
  11. 在Python中处理大型文件的最快方法
  12. C++数据结构02--链式线性表(单链表的实现)
  13. 如何创建SQL Server日志传送
  14. 数据挖掘比赛笔记总结
  15. 五种主流的linux操作系统,五款常用的Linux操作系统
  16. 利用SPSS Modeler进行数据挖掘——探究不同程序语言的就业情况
  17. x64位xp连接位于32位xp系统上的打印机
  18. MATLAB运行cpp文件(从配置到运行)
  19. 【重磅】新智元推出百万级AI智库资讯互动平台,AI World2017世界人工智能大会TOP10大奖榜单发布
  20. 2020年正月初九 那个安检口的女子

热门文章

  1. java 实际参数列表和形式参数列表长度不同
  2. 2022年信息学奥赛CPS-JS各地分数线汇总
  3. 人工智能之高清监控视频存储新技术
  4. 生成式模型和判别式模型
  5. Java中BorderLayout布局管理器的两种排列实现方式
  6. C语言实现二叉树前序中序后序递归与非递归遍历、层次遍历、二叉树带权路径长度
  7. 生活随笔:天热得让人烦躁
  8. 什么是 none:none镜像?什么是dangling镜像?为什么会出现?什么时候会出现?
  9. 桔梗网导航怎么取消?? so-easy
  10. java与sql学生考勤管理系统_SSM实现学生考勤管理系统、javaweb+mysql