理解  悲观锁就是什么事情都是需要小心翼翼,生怕弄错了出大问题,

一般情况下 "增删改" 都是有事务在进行操作的,但是 "查" 是不需要事务操作的,

但是凡事没有例外,比如双十一购物,很多人抢购一个物品,但是商品总数(假设5个)

同一时间进行操作,每个人都能看到物品多少个,都早同一时间下单,但是只有5个商品,只有5个用户能过购买到(每人一个购买),其他人也会显示出订单的操作,但是库存已经是为0无法购买的行为(显示还是5ge库存),会给用户造成不好体验

既让如此 为什么不让一个事务锁定物品的个数修改,而其他用户只能查看,并不能下单,当用户进行updata操作之后释放锁,其他用户才能根据情况下单,再次把物品行锁住(不会出现订单表交钱了还提示没库存)

可能我说的不是很准确,但是悲观锁就是一步一步走,如果轮到它则执行则锁行操作,避免一些问题,一般用在金钱查询,库存查询等...

执行sql语句格式

select money from usercred where id=1 for update;

统一格式在select查询条件之后增加 for updata (记住查询条件是索引列才是锁行不让则是锁表)            查询操作中除了敏感数据查询,其他不需要使用锁行操作

总体理解就是 悲观锁是一个在有需要求的情况下查询语句事务中隔离性最高的ser...  串行,当悲观锁锁住行时,其他事务只能等待,并且不能读取该行悲观数据

并且悲观锁只能在begin和commit之间执行




乐观锁 查询出需要修改的数据,但是增加一个字段作为一个版本控制(像git一样),如果进行修改一起将版本控制的字段一起where作为条件,如果符合则修改,不符合也没事,因为数据库中的数据给其他事务修改之后,where查询的条件不符合,所以不会对持久化的数据造成影响

例子如下

create table card(
id int;
money float;
version int; // 乐观锁控制,字段名无所谓
primary key(id); // 主键
auto increment(id); // 自增长
index(money,version); // 索引
);

创建上面一个表,我使用go的gorm来表达一下操作

type card struct{
Id int `gorm:"id"`
Money float `gorm:"money"` // 默认这个账户100元
Version int `gorm:"varsion"`
} func main(){
var c card
if err := db.first(&c).Error():err!=nil{ // 查出一条数据
panic(err)
}
err = db.Model(&c).Where("id = ? and varsion = ?",c.Id,c.Version).updata(c.Money + 200 ,c.Version+1).error()
if err != nil{
// 说明其他事务在我执行这个操作时进行了updata commit,我这边where在数据查询表没有出现符合条件的,所以执行失败
}
fmt.Println("success")
}

乐观锁就不是一个事务的操作,是手动创建的一种逻辑来保证数据一致性

根据多个条件来进行控制数据是否和查询时一致保持安全

比方  a 操作查询得到一个数据,其中返回的数据集中含有 money(100)和一个varsion(1),,你对这个数据进行修改,其中money+100,varsion+1 ,但是在你修改还没有提交时,其他b,c,d..的连接也同时和你一样的操作,并且比你提交commit的速度快,当你使用updata修改语句去根据先前查询得到结果寻找数据时,对比version和money,但是已经有其他提交比你快提交了,找不到a查询过的数据行(此时时b连接提交的数据是money = 300,version=2),所以不会提交,丢弃操作,

乐观使用一个额外字段保证数据和查询出时的数据一致才会更新(更新查询时查询的条件要有唯一属性,不让更新查询时出现多个操作不可逆)


悲观锁更加适合转账交易业务,乐观锁倾向并不是对数据要求绝对安全的环境,但是绝对不适用于转账交易等敏感地位

悲观锁和事务区别在于

悲观锁会将查询时就将行锁住,其他连接操作不能查询更不能修改,但是也是事务的一种

事务  一般用于增删改而不用于查的事务管理(虽然也可以管理查的事务,但是和悲观锁一样差不多,除非时特别需求,不然不会要求对查的操作加锁)

mysql 学习日记 悲观和乐观锁的更多相关文章

  1. 【mysql】mysql增加version字段实现乐观锁,实现高并发下的订单库存的并发控制,通过开启多线程同时处理模拟多个请求同时到达的情况 + 同一事务中使用多个乐观锁的情况处理

    mysql增加version字段实现乐观锁,实现高并发下的订单库存的并发控制,通过开启多线程同时处理模拟多个请求同时到达的情况 ==================================== ...

  2. 谈谈mysql的悲观和乐观锁

    悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念.之前有写过一篇文章关于并发的处理思路和解决方案,这里我单独将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍一 ...

  3. Redis 事物、悲观、乐观锁 (详细)

    1,概论 事物这东西相信大家都不陌生吧,在学习Spring,Mybatis等框架中, 只要是涉及到数据存储和修改的,都会有事物的存在, 废话就不多说了下面我们来简单的介绍下Redis事物以及锁. 2, ...

  4. MySQL学习笔记十六:锁机制

    1.数据库锁就是为了保证数据库数据的一致性在一个共享资源被并发访问时使得数据访问顺序化的机制.MySQL数据库的锁机制比较独特,支持不同的存储引擎使用不同的锁机制. 2.MySQL使用了三种类型的锁机 ...

  5. Java并发 行级锁/字段锁/表级锁 乐观锁/悲观锁 共享锁/排他锁 死锁

    原文地址:https://my.oschina.net/oosc/blog/1620279 前言 锁是防止在两个事务操作同一个数据源(表或行)时交互破坏数据的一种机制. 数据库采用封锁技术保证并发操作 ...

  6. Mysql中的读锁,写锁,乐观锁及事务隔离级别和并发问题

    mysql读锁,写锁,乐观锁 读锁,也叫共享锁(shared lock) SELECT * FROM table_name  WHERE ...  LOCK IN SHARE MODE 写锁,也叫排他 ...

  7. Java深入学习(5):锁

    可重入锁: 简单来说,支持重复加锁,有可重用性 特征:锁可以传递,方法递归传递 目的:避免了死锁现象 代码: public class Test implements Runnable { @Over ...

  8. MySQL学习(四)深入理解乐观锁与悲观锁

    转载自:http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据 ...

  9. MySQL学习笔记(四)悲观锁与乐观锁

    恼骚 最近在搞并发的问题,订单的异步通知和主动查询会存在并发的问题,用到了Mysql数据库的 for update 锁 在TP5直接通过lock(true),用于数据库的锁机制 Db::name('p ...

随机推荐

  1. MOOC(11)- 获取cookie后存到json中

    获取cookie后转成字典格式 把字典格式cookie存到json数据中 需要在表格中写好关键字,判断是否写cookie.是否读cookie 在需要用cookie的时候根据键去json中取值 # 1. ...

  2. Python: Socket网络编程,多线程处理小Demo

    一个简单的例子,深入研究一下socket的多线程处理任务 Server端: #!/usr/bin/env python #encoding:utf8 # # 注意:定义encoding时必须在第二行 ...

  3. .js——alert()语句

    在.js文件中,通过alert()语句可以生成弹出框,弹出框中的内容message部分可以是常量字符串,也可以是含有变量的字符串连接,下面举几个例子简要说明下: 1. 参数为常量字符串 alert(& ...

  4. 押宝在Apple Watch的智能手表游戏玩得转吗?

    Watch的智能手表游戏玩得转吗?" title="押宝在Apple Watch的智能手表游戏玩得转吗?"> 如果你给法拉利跑车贴上金箔,会被认为是俗气.但若在Ap ...

  5. 编译gcc报错make[3]: Leaving directory `/usr/local/src/gcc-7.4.0/build/gcc' make[2]: *** [all-stage1-gcc] Error 2 处理

    因业务需要安装7.4高版本gcc时报错: configure: error: in `/usr/local/src/gcc-7.4.0/build/gcc': configure: error: C+ ...

  6. 理解 Redux 中间件机制

    Redux 的 action 是一个 JS 对象,它表明了如何对 store 进行修改.但是 Redux 的中间件机制使action creator 不光可以返回 action 对象,也可以返回 ac ...

  7. 吴裕雄--天生自然KITTEN编程:移动与旋转

  8. Choway Blog

    choway 2018-12-11 09:23:46 JavaJVM Java 虚拟机(JVM)在执行 Java 程序时会把它管理的内存划分为多个不同的数据区域.这些区域各有用途,以及创建和销毁的时间 ...

  9. iOS适配UIViewView/WKWebView,H5生成长图,仿微信进度条

    前段时间撸代码猥琐发育的时候,设计师老王给了张截图某宝APP上一个生成长图分享的功能,正好公司有这个需求,于是在立马开始操练起来!在万能的度娘上搜集整理资料后发现很多文章介绍的方案对WKWebView ...

  10. Python-控制语句及函数

    if-elif-else for while 函数 函数定义 空函数 pass 返回多个值 可变参数 * 关键字参数 ** 控制语句 if - elif - else 比如,输入用户年龄,根据年龄打印 ...