mysql-mysql悲观锁和乐观锁
1、mysql的四种事务隔离级别
I. 对于同时运行多个事务,当这些事务访问数据库中的相同数据时,如果没有采取必要的隔离机制,就会导致各种并发问题。
(1)脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.
(2)不可重复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.
(3)幻读: 对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.
II.数据库事务的隔离性:数据库必须的隔离并发运行多个事务的能力,使它们不会相互影响,避免各种并发问题。
III.隔离级别:一个事务与其它事务的隔离程度称为隔离级别,数据库规定了多种隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数扰一致性就越好,但并发性也就越弱。
(1)读未提交数据,允许事务读取未被其它事务提交的变更,上面三个问题都会出现。
(2)读已提交数据,允许事务读取被其它事务提交的变理,避免脏读,但会出现不可重复读和幻读。
(3)可重复读,确保一个事务可以从一个字段读取相同的值,在此事务持续期间,禁止其它事务操作该字段,幻读问题仍存在
(4)串行化,效率低
IV.mysql默认的隔离级别是可重复读,设置数据库隔离级别有两种方式
(1)使用Sql语句修改数据库的隔离级别。
(2)在 Hibernate 中设置隔离级别
READ UNCOMMITED
READ COMMITED
REPEATABLE READ
SERIALIZEABLE
2、mysql悲观锁
只有执行select * from table for update语句时,才会执行mysql的悲观锁,
要使用悲观锁,我们必须关闭mysql数据库的自动提交属性,因为MySQL默认使用autocommit模式,
也就是说,当你执行一个更新操作后,MySQL会立刻将结果进行提交。
(1)mysql的锁级别,Row Lock和Table Lock ,mysql的默认锁级别是Row-Level Lock
表A有三个字段 id , name, age,其中id为主键,name有索引,age为普通字段
a.执行select * from A where id=1 for update
这种情况会锁row
b.执行select * from A where name=1 for update
这种情况会锁row
c.执行select * from A where age=1 for update
这种情况会锁表
(2)悲观锁,它指的是某一事务,对数据被另一事务的修改持保守态度,即,每次查询的时候就会锁定记录或锁定表,直到修改完成
需要注意的是,如果事务A执行了select * from A where id = 3 for update ,则B事务如果执行
select * from A where id = 3 for update则要等待A事务结束后才会执行
3、mysql乐观锁
(1)概念:
乐观锁假设认为数据一般情况下不会造成冲突所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,
如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。
(2)实现方式
方式一:
使用数据版本(Version)记录机制实现,将version字段的值一同读出,数据每更新一次,对此version值加一。
当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,
如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据
方式二:
需要乐观锁控制的table中增加一个字段,名称无所谓,字段类型使用时间戳(timestamp),
和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,
如果一致则OK,否则就是版本冲突。
4、悲观锁使用场景举例
有两张表,一张货物表goods,一张用户表account,账户表有用户名和用户钱数
不使用锁的情况下:
(1)A用户查询goods表,发现货物还剩一件,然后A用户执行付款操作,此时,B用户也发现goods表还有一件,也执行付款操作,
(2)B的动作比A快,此时B付完款,goods表减1,此时A也付完款了,发现货物没了,所以就有问题
联想到事物一个使用场景,
A访问表,修改goods表的剩余量,是一个事物,
A付款是一个事物,保证两个事务都完成,或者都完不成,两个小事务要运行在一个大事务里面
5、悲观锁和乐观锁的总结
乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,
加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,
这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。
mysql-mysql悲观锁和乐观锁的更多相关文章
- mysql的锁--行锁,表锁,乐观锁,悲观锁
一 引言--为什么mysql提供了锁 最近看到了mysql有行锁和表锁两个概念,越想越疑惑.为什么mysql要提供锁机制,而且这种机制不是一个摆设,还有很多人在用.在现代数据库里几乎有事务机制,aci ...
- Mysql锁机制--乐观锁 & 悲观锁
Mysql 系列文章主页 =============== 从 这篇 文章中,我们知道 Mysql 并发事务会引起更新丢失问题,解决办法是锁.所以本文将对锁(乐观锁.悲观锁)进行分析. 第一部分 悲观锁 ...
- Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景
一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁定一行) |--共享锁(S锁,MyISAM 叫做读锁) |--排他锁(X锁,MyISAM 叫做写锁) |--悲观锁( ...
- MySQL学习笔记(四)悲观锁与乐观锁
恼骚 最近在搞并发的问题,订单的异步通知和主动查询会存在并发的问题,用到了Mysql数据库的 for update 锁 在TP5直接通过lock(true),用于数据库的锁机制 Db::name('p ...
- mysql 悲观锁与乐观锁的理解
悲观锁与乐观锁是人们定义出来的概念,你可以理解为一种思想,是处理并发资源的常用手段. 不要把他们与mysql中提供的锁机制(表锁,行锁,排他锁,共享锁)混为一谈. 一.悲观锁 顾名思义,就是对于数据的 ...
- 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...
- 关于MySql悲观锁与乐观锁
悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念.本文将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍. 悲观锁(Pessimistic Lock) 悲观锁的 ...
- 【MySQL锁】MySQL悲观锁和乐观锁概念
悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念.本文将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍. 悲观锁(Pessimistic Lock) 悲观锁的 ...
- mysql悲观锁与乐观锁
简介 数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性. 用途 乐观锁和悲观锁是并发控制主要采用的技术手段.无论是悲观 ...
- 浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景
浅谈Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁 ...
随机推荐
- Mysql学习笔记(一)
技术的王国太过迷人,我刚从事IT就被各种技术所引诱迷惑,什么都想学.我还算言而有信的那一类人,还好有一丁点毅力,于是各种东西都沾染了一点.但是这种遍地开花的情况实在和我的智商不匹配.我没有那么多的精力 ...
- 用css3实现各种图标效果(1)
公共样式 应该说现在绝大多数公司的项目前端都是一团乱,不仅仅是js写的没有任何框架而言,css同样也是如此,导致项目如果要升级或者说有新的变更维护起来就特别困难. 最近领导决定花大时间整理一下css样 ...
- 谈谈 ES6 的 Promise 对象
https://segmentfault.com/a/1190000002928371 前言 开篇首先设想一个日常开发常常会遇到的需求:在多个接口异步请求数据,然后利用这些数据来进行一系列的操作.一般 ...
- Hibernate Hql 总结
1.from子句 Hibernate中最简单的查询语句的形式如下: from eg.Cat该子句简单的返回eg.Cat类的所有实例. 通常我们不需要使用类的全限定名, 因为 auto-import(自 ...
- CSS-论css如何纯代码实现内凹圆角
background-image: radial-gradient(200px at 50px 0px, #fff 50px, #4169E1 50px); 这是做内凹圆角的核心代码,就是背景图的ra ...
- 在浏览器输入 URL 后会发生什么?超级详细介绍
一个古老的面试问题:当你在浏览器中输入whosmall.com并且按下回车之后发生了什么? 不过我们不再局限于平常的回答,而是想办法回答地尽可能具体,不遗漏任何细节. 这将是一个协作的过程,所以深入挖 ...
- php 如何造一个简短原始的数据库类用来增加工作效率
class DBDA{ public $host="localhost"; public $uid="root"; public $pwd="123& ...
- linux安装pip
1.先说一下什么是pippip 是"A tool for installing and managing Python packages.",也就是说pip是python的软件安装 ...
- 9月22日下午JavaScript----Document对象
document对象 一.找元素 1.根据id找 示例: <input id = "a" type="button" value="找元素&qu ...
- sublime中安装css 格式化插件
HTML-CSS-JS Prettify解决问题 今天发现此插件依赖于nodejs,如果本机没有安装nodejs,会一直提示你安装,解决方法很简单,直接brew install nodejs即可 看看 ...