乐观锁:

乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。而乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本( Version )记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。更新数据时将读出的版本号作为一个条件,如果数据库表中版本号与此版本号相同则能更新成功,否则更新失败。

例如一个金融系统,当某个操作员读取用户的数据,并在读出的用户数据的基础上进行修改时(如更改用户帐户余额),如果采用悲观锁机制,也就意味着整个操作过 程中(从操作员读出数据、开始修改直至提交修改结果的全过程,甚至还包括操作 员中途去煮咖啡的时间),数据库记录始终处于加锁状态,可以想见,如果面对几百上千个并发,这样的情况将导致怎样的后果。

乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本 ( Version )记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现(也可以采用另一种方式,同样是在需要乐观锁控制的table中增加一个字段,名称无所谓,字段类型使用时间戳timestamp, 和上面的version类似,也是在更新的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突)。

优点:

从上面的例子可以看出,乐观锁机制避免了长事务中的数据库加锁开销,大大提升了大并发量下的系统整体性能表现。

缺点:

乐观锁机制往往基于系统中的数据存储逻辑,因此也具备一定的局限性,如在上例中,由于乐观锁机制是在我们的系统中实现,来自外部系统的更新操作不受我们系统的控制,因此可能会造成脏数据被更新到数据库中。在系统设计阶段,应该充分考虑到这些情况出现的可能性,并进行相应调整(如将乐观锁策略在数据库存储过程中实现,对外只开放基于此存储过程的数据更新途径,而不是将数据库表直接对外公开)。

mysql内置乐观锁吗_mysql 乐观锁详解相关推荐

  1. Nginx内置变量以及日志格式变量参数详解

    Nginx内置变量以及日志格式变量参数详解 $args #请求中的参数值 $query_string #同 $args $arg_NAME #GET请求中NAME的值 $is_args #如果请求中有 ...

  2. python 内置函数ord()和chr()函数用法详解

    python 中的ord()函数和chr()函数 需要对字符进行转换时使用 其中ord函数可以将字符转化为你所需要的ASCII码,chr函数可以将0-255中的任一整数转化为你所需要的字符. 通过这样 ...

  3. mysql内置时间函数大全_MySQL 的时间函数 大全

    MySQL 的时间函数 大全 2014年02月14号 发表于:评论 (1) 热度:1109 一.MySQL获得当前日期时间函数 1.1  获得当前日期+ 时间(date  +  time)函数:now ...

  4. mysql中修改表结构语法_MySQL表结构修改详解

    MySQL修改表的语法 ========================= 增加列[add 列名] ========================= ①alter table 表名 add 列名 列 ...

  5. Python的内置函数你知道多少?超详解指南

  6. 数据库 - mysql内置功能

    mysql内置功能: 1.视图 2.触发器 3.存储过程 4.事务 5.函数 一.视图 介绍: 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名], 用户使用时只需 ...

  7. mysql内置变量_详解MySQL注入利用的变量

    MySQL注入数据库时,我们可以利用内置的变量来得到更多的mysql信息,下面就让我们一起来了解MySQL注入利用的变量. 当我们注射mysql库的输入点的时候,可以通过version()/user( ...

  8. mysql内置函数,在mysql里面利用str_to_date()把字符串转换为日期格式

    mysql内置函数,在mysql里面利用str_to_date()把字符串转换为日期格式 示例:分隔符一致,年月日要用%号 select str_to_date('2008-4-2 15:3:28', ...

  9. mysql 内置功能 存储过程介绍

    存储过程介绍 就是mysql内置功能把逻辑写好 的功能给封装好,封装成一个接口名,把接口名丢给应用程序,应用程序直接调用接口名实现一系列增删改查功能 这个接口叫存储过程 基于存储过程封装成一个功能 存 ...

  10. mysql内置的变量,MySQL服务器模式及相关内置变量

    本章我们主要包含两部分的内容: MySQL服务器模式 MySQL内置变量 1. MySQL服务器模式 不同的MySQL客户端可以通过不同的模式操作MySQL Server.DBA可以设置一个全局模式, ...

最新文章

  1. VIM_shortcut_Cheat_sheet
  2. 经典题目螺旋方阵的详解
  3. 【theano-windows】学习笔记十六——深度信念网络DBN
  4. dotnet core 应用是如何跑起来的 通过AppHost理解运行过程
  5. Java多线程同步机制
  6. redis的使用场景和基本数据类型
  7. 终于有人把「同侪效应」讲明白了
  8. 美团技术专家云鹏:写给工程师的十条精进原则!
  9. 从读写角度,带你了解数仓的IO基本框架
  10. mysql将最大金额加1000_Mysql数据库笔记
  11. win7查看硬盘序列号
  12. 为什么梯度反方向是函数下降最快的方向?
  13. 偏最小二乘法_实例讲解:简明扼要最小二乘法计算过程
  14. wttr.in Linux 下查看天气
  15. 单出口双防火墙双核心冗余_王术芳/海关缴款书抵扣和出口退税操作变化要点解析...
  16. 郑捷《机器学习算法原理与编程实践》学习笔记(第二章 中文文本分类(三)—KNN算法)...
  17. spring boot oauth2 facebook
  18. Unity技能系统框架(三)分析一个具体被动技能
  19. 软件项目管理:教你如何做好团队管理
  20. saveOrUpdate

热门文章

  1. 零基础学caffe源码 ReLU激活函数
  2. 用matlab让高低音频重叠,音频分帧,叠加后仍有不连续
  3. mysql nosql引擎_nosql与mysql的区别是什么
  4. xe ftp.config.php,用PHP实现一个高效安全的ftp服务器(一)
  5. Jmeter之控制线程执行到某个结果时退出执行
  6. Jmeter之创建Kafka生产者和消费者进行性能测试
  7. Linux Shell脚本攻略:shell中各种括号()、(())、[]、[[]]、{}的作用
  8. Selenium3自动化测试——16. 处理HTML5视频播放
  9. JAVA编写一个telephone_JAVA练习.doc
  10. 树莓派3 64linux,树莓派3 model b安装64位debian+qt5.9