2017-10-25 回答

关于mysql中的乐观锁和悲观锁面试的时候被问到的概率还是比较大的。

mysql的悲观锁:

其实理解起来非常简单,当数据被外界修改持保守态度,包括自身系统当前的其他事务,以及来自外部系统的事务处理,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制,但是也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在自身系统中实现了加锁机制,也无法保证外部系统不会修改数据。

来点实际的,当我们使用悲观锁的时候我们首先必须关闭mysql数据库的自动提交属性,因为mysql默认使用autocommit模式,也就是说,当你执行一个更新操作后,mysql会立刻将结果进行提交。

关闭命令为:set autocommit=0;

悲观锁可以使用select…for update实现,在执行的时候会锁定数据,虽然会锁定数据,但是不影响其他事务的普通查询使用。此处说普通查询就是平时我们用的:select * from table 语句。在我们使用悲观锁的时候事务中的语句例如:

//开始事务

begin;/begin work;/start transaction; (三选一)

//查询信息

select * from order where id=1 for update;

//修改信息

update order set name='names';

//提交事务

commit;/commit work;(二选一)

此处的查询语句for update关键字,在事务中只有select ... for update 或lock in share mode 同一条数据时会等待其它事务结束后才执行,一般的select查询则不受影响。

执行事务时关键字select…for update会锁定数据,防止其他事务更改数据。但是锁定数据也是有规则的。

查询条件与锁定范围:

1、具体的主键值为查询条件

比如查询条件为主键id=1等等,如果此条数据存在,则锁定当前行数据,如果不存在,则不锁定。

2、不具体的主键值为查询条件

比如查询条件为主键id>1等等,此时会锁定整张数据表。

3、查询条件中无主键

会锁定整张数据表。

4、如果查询条件中使用了索引为查询条件

明确指定索引并且查到,则锁定整条数据。如果找不到指定索引数据,则不加锁。

悲观锁的确保了数据的安全性,在数据被操作的时候锁定数据不被访问,但是这样会带来很大的性能问题。因此悲观锁在实际开发中使用是相对比较少的。

mysql的乐观锁:

相对悲观锁而言,乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会对数据的冲突与否进行检测,如果发现冲突,则让返回用户错误的信息,让用户决定如何去做。

一般来说,实现乐观锁的方法是在数据表中增加一个version字段,每当数据更新的时候这个字段执行加1操作。这样当数据更改的时候,另外一个事务访问此条数据进行更改的话就会操作失败,从而避免了并发操作错误。当然,还可以将version字段改为时间戳,不过原理都是一样的。

例如有表student,字段:

id,name,version

1 a 1

当事务一进行更新操作:update student set name='ygz' where id = #{id} and version = #{version};

此时操作完后数据会变为id = 1,name = ygz,version = 2,当另外一个事务二同样执行更新操作的时候,却发现version != 1,此时事务二就会操作失败,从而保证了数据的正确性。

悲观锁和乐观锁都是要根据具体业务来选择使用,本文仅作简单介绍。

mysql乐观锁和悲观锁的区别_mysql悲观锁和乐观锁的区别相关推荐

  1. mysql悲观锁和乐观区别_MySQL悲观锁和乐观锁的区别是什么

    MySQL悲观锁和乐观锁的区别是什么 区别如下: 1.概念不同 乐观锁( Optimistic Locking): 顾名思义,对加锁持有一种乐观的态度,即先进行业务操作,不到最后一步不进行加锁,&qu ...

  2. mysql悲观锁会有脏数据吗_mysql悲观锁原理详解

    mysql中的锁概念 mysql已经成为大家日常数据存储的最常用平台,但随着业务量和访问量的上涨,会出现并发访问等场景,如果处理不好并发问题的话会带来严重困扰.下面介绍一下如何通过mysql的悲观锁来 ...

  3. mysql存储引擎的区别_Mysql的两种存储引擎以及区别

    一.Mysql的两种存储引擎 1.MyISAM: ①不支持事务,但是整个操作是原子性的(事务具备四种特性:原子性.一致性.隔离性.持久性) ②不支持外键,支持表锁,每次所住的是整张表 MyISAM的表 ...

  4. mysql utf8和gbk的区别_MySQL字符集 GBK、GB2312、UTF8区别

    MySQL中涉及的几个字符集 character-set-server/default-character-set:服务器字符集,默认情况下所采用的. character-set-database:数 ...

  5. mysql锁总结知乎_Mysql悲观锁乐观锁区别与使用场景

    概念上区别 乐观锁(Optimistic Locking):顾名思义,对加锁持有一种乐观的态度,即先进行业务操作,不到最后一步不进行加锁,"乐观"的认为加锁一定会成功的,在最后一步 ...

  6. 【JUC并发】常见面试题:wait、sleep、park之间的区别,synchronized、ReentrantLock之间的区别,悲观锁与乐观锁

    wait 与 sleep 不同 sleep 是 Thread 方法,而 wait 是 Object 的方法 sleep 不需要强制和 synchronized 配合使用,但 wait 需要 和 syn ...

  7. mysql记录锁与互斥锁区别_MySQL的各种锁认知

    一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁定一行) |--共享锁(S锁,MyISAM 叫做读锁) |--排他锁(X锁,MyISAM 叫做写锁) |--悲观锁( ...

  8. mysql悲观锁的应用_mysql悲观锁

    悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个很是基础的概念.mysql 悲观锁(Pessimistic Lock) 悲观锁的特色是先获取锁,再进行业务操做,即"悲观&qu ...

  9. Java 独占锁ReentrantLock、读(悲观读)写锁ReentrantReadWriteLock、读(乐观读/悲观读)写锁StampedLock

    1.AbstractQueuedSynchronizer 锁必然要知道AbstractQueuedSynchronizer(AQS),AQS提供了一个框架,用于实现依赖于先进先出(FIFO)等待队列的 ...

  10. mysql实现悲观锁_mysql悲观锁怎么实现?

    mysql悲观锁的方法:1.首先利用[select ... for update]加锁,操作完成后使用commit来释放锁:然后innodb引擎来默认行级锁:最后查不到数据时,则不锁表即可. mysq ...

最新文章

  1. DNN和IBatis.Net几乎同时发布新版本
  2. ISA Server中基于L2TP实现远程拨入***
  3. 架构设计系列-前端模式的后端(BFF)翻译PhilCalçado
  4. IPSEC ×××实验六:ASA SSL ×××
  5. 一不小心,它成为了 GitHub Alibaba Group 下 Star 最多的开源项目
  6. Oracle清除缓存的命令,Oracle的get命令
  7. 说不尽的嘎达梅林:读郭雪波的长篇小说《青旗•嘎达梅林》
  8. python执行效果_使用tqdm显示Python代码执行进度功能
  9. 行业研究 | 语音识别行业发展现状解读
  10. php7与mysql相关配置_PHP7连接mysql,文件配置问题
  11. 高中计算机网络培训心得体会,高中老师信息技术培训心得体会
  12. java代码性能优化实例
  13. codesys工控机_CoDeSys
  14. 第1142期AI100_机器学习日报(2017-11-03)
  15. Python -- 创建数字列表
  16. micro/微店API接口(item_search-根据关键词取商品列表)
  17. SEO优化核心盘点,解谜、扫雷、权重提升统统在这
  18. 熊猫在线压缩图_回归图与熊猫和脾气暴躁
  19. 白色用rgba怎么设置html,在白色上将RGB转换为RGBA
  20. 仿真或极简,用户界面的美丽与哀愁

热门文章

  1. MATLAB rolcus函数,利用Matlab绘制系统的根轨迹.doc
  2. C# MysqlHelper 执行reader时,遇到致命错误或者超时
  3. js遍历jstl数组
  4. [HDU4585]Shaolin
  5. C#JSON格式数据的转换
  6. DBCC CHECKDB
  7. Windows 7 SP1开发完毕 已进入测试阶段
  8. 简述物联网感知技术_雄芯一号芯片发布 智慧城市物联网感知体系升级换新
  9. wordpress配置邮箱发送功能
  10. python爬取58同城房子发布的手机号码_python爬虫:爬取58同城武汉地区商品房信息(最后碰到了58同城的反爬机制,吓得我不敢说话···)...