博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mysql 自动加锁_MYSQL事务 SELECT会自动加锁 及乐观锁
阅读量:5106 次
发布时间:2019-06-13

本文共 1131 字,大约阅读时间需要 3 分钟。

1,mysql事务 select会自动加锁吗?

总结:mysql事务select 只是进行了隔离,保证数据的一致性,并没有加锁,如果要加锁可以用for update。

验证下:

新建一张表user 添加两个字段,id,name,随便添加几条数据。

打开一个mysql会话(窗口1)

执行如下语句

begin;

select * from user where id=1;

新开窗口2执行更新操作

update user set name='rain' where id=1;

可以成功更新但是窗口1中的事务读取到的还是以前的数据,从而说明第一个窗口的事务里的select并没有锁,但是具有隔离性并没有读取到窗口2里面更新后的数据。

下面回到第一个窗口1将select语句锁住

select * from user where id=1 for update;

再回到窗口2进行更新操作,发现导致了mysql阻塞,更新失败,从而说明窗口1的select被锁住。

当窗口1的事务提交后,窗口2的update执行成功。

注意:由于 InnoDB 预设是Row-Level Lock,所以只有「 明确 」的 指定主键 , MySQL 才会执行 Row lock (只锁住被选取的资料例) , 否 则MySQL将会执行 Table Lock (将整个资料表单给锁住)。

2,乐观锁介绍

4ceb06e0c812

image.png

乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。那么我们如何实现乐观锁呢,一般来说有以下2种方式:

1.使用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现方式。何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据。如上图所示.

2.乐观锁定的第二种实现方式和第一种差不多,同样是在需要乐观锁控制的table中增加一个字段,名称无所谓,字段类型使用时间戳(timestamp), 和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突。

转载地址:http://vmudv.baihongyu.com/

你可能感兴趣的文章
Redis系列--内存淘汰机制(含单机版内存优化建议)
查看>>
c++ STL
查看>>
json数据在前端(javascript)和后端(php)转换
查看>>
[Serializable]的应用--注册码的生成,加密和验证
查看>>
Groovy中那些神奇注解之ToString
查看>>
宇宙第一开发工具:vs2019 开发Python
查看>>
Day19内容回顾
查看>>
第七次作业
查看>>
c++map的用法
查看>>
vim工具
查看>>
MySql update inner join!MySql跨表更新 多表update sql语句?如何将select出来的部分数据update到另一个表里面?...
查看>>
我最宏大的个人愿望
查看>>
北漂周记--第5记--拼命编程
查看>>
比赛总结一
查看>>
SpringBoot项目打包
查看>>
JSP的3种方式实现radio ,checkBox,select的默认选择值
查看>>
Linux操作系统 和 Windows操作系统 的区别
查看>>
《QQ欢乐斗地主》山寨版
查看>>
文件流的使用以及序列化和反序列化的方法使用
查看>>
Android-多线程AsyncTask
查看>>