mysql 快照读、当前读、幻读、共享锁、排它锁、记录锁(也叫行锁)、间隙锁

事务的四个特点ACID

原子性(Atomicity)

原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

一致性(Consistency)

事务前后数据的完整性必须保持一致。

隔离性(Isolation)

事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

持久性(Durability)

持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

幻读

幻读是事务不是独立执行的时候发生的一种现象。例如:第一个事务对表中的所有行的某个字段del置为1,同时第二个事务插入了一行del=0的数据,这时候第一个事务的用户就会发现还有没被自己修改的数据,好像发生了幻觉。

脏读

A事务读取了B事务未提交的数据。当事务B发生回滚的时候,A事务读取到的数据就是脏数据。

不可重复读

如果你在时间点T1读取了一些记录,在T2时再想重新读取一次同样的这些记录时,这些记录可能已经被改变、或者消失不见。

由ANSI/ISO定义的SQL-92标准定义的四种隔离级别

隔离解别 脏读 不可重复读 幻读
Read Uncommitted Y Y Y
Read Committed N Y Y
Repeatable(default) N N Y
Serializable N N N

为什么不默认:
Serializable级别 只允许一个事务在执行,其它事务必须等待这个事务执行完后才能执行。没有并发,只是单纯的串行。效率堪忧

快照读

正常的select查询(不包括SELECT … LOCK IN SHARE MODE;和SELECT … FOR UPDATE;)

当前读

当前读, 读取的是最新版本, 并且对读取的记录加锁, 阻塞其他事务同时改动相同记录,避免出现安全问题。

mysql隔离技术

在mysql中,提供了两种事务隔离技术, mvcc和next-key 。
mvcc的优势是不加锁,并发性高,缺点是不是实时数据。
next-key的优势是获取实时数据,但是需要加锁。

MVCC(multi version concurrent control) 多版本并发控制

select:事务每次只能读到创建版本号小于等于此次系统版本号的记录,同时行的删除版本号不存在或者大于 当前事务的版本号。
update:插入一条新记录,并把当前系统版本号作为行记录的版本号,同时保存当前系统版本号到原有的行作为删除版本号。
delete:把当前系统版本号作为行记录的删除版本号
insert:把当前系统版本号作为行记录的版本号

next-key锁

Record lock和Gap lock的结合,即除了锁住记录本身,还要再锁住索引之间的间隙。

Record lock(行锁)

单条索引记录上加锁,record lock锁住的永远是索引,而非记录本身,即使该表上没有任何索引,那么innodb会在后台创建一个隐藏的聚集主键索引,那么锁住的就是这个隐藏的聚集主键索引。所以说当一条sql没有走任何索引时,那么将会在每一条聚集索引后面加X锁(X:排他锁 S:共享锁)。

Gap lock(间隙锁)

锁的区间:根据检索条件向下寻找最靠近检索条件的记录值A作为左区间,向上寻找最靠近检索条件的记录值B作为右区间,即锁定的间隙为(A,B)。
例如 :

id num
1 1
3 2
5 3
7 3
9 3
10 4
12 5

select * from t where num =3;那么间隙锁锁定的间隙为:(2,4),当你插入此区间的数据,或者将此区间的值改出去或者区间外改进来时候会被阻塞,保证num=3的行数是固定的。

共享锁

select…from lock in share mode
在扫描到的任何索引记录上加共享的(shared)next-key lock,还有主键聚集索引加排它锁

排它锁

####select…from for update
在扫描到的任何索引记录上加排它的next-key lock,还有主键聚集索引加排它锁

SELECT … LOCK IN SHARE MODE走的是IS锁(意向共享锁),即在符合条件的rows上都加了共享锁,这样的话,其他session可以读取这些记录,也可以继续添加IS锁,但是无法修改这些记录直到你这个加锁的session执行完成(否则直接锁等待超时)。

SELECT … FOR UPDATE 走的是IX锁(意向排它锁),即在符合条件的rows上都加了排它锁,其他session也就无法在这些记录上添加任何的S锁或X锁。

lock in share mode适用于两张表存在业务关系时的一致性要求,for update适用于操作同一张表时的一致性要求

参考文档
https://blog.csdn.net/taylor_tao/article/details/7063639
https://www.cnblogs.com/wwcom123/p/10727194.html

数据库事务和一致性处理相关推荐

  1. 简单理解mysql事务_如何理解数据库事务中的一致性的概念?

    比较支持@Kai Peng 的答案,只是缺少例子说明. 而其他一些人的答案甚至有明显的错误.最近正好也在研究这方面的东西,不算是回答,就是跟大家讨论讨论. 首先,我们需要搞清楚为什么会出现事务.[1] ...

  2. mysql数据库事务的概念_如何理解数据库事务中的一致性的概念?

    比较支持@Kai Peng 的答案,只是缺少例子说明. 而其他一些人的答案甚至有明显的错误.最近正好也在研究这方面的东西,不算是回答,就是跟大家讨论讨论. 首先,我们需要搞清楚为什么会出现事务.[1] ...

  3. mysql 事务原子性_数据库事务原子性、一致性是怎样实现的?

    先借用前辈的一句话:数据库事务有不同的隔离级别,不同的隔离级别对锁的使用是不同的,锁的应用最终导致不同事务的隔离级别. 隔离性分为四个级别: 1读未提交:(Read Uncommitted) 2读已提 ...

  4. 数据库事务、分布式一致性和分布式事务

    文章目录 什么是事务 事务(ACID)的特性 对事务一致性的理解 分布式一致性 CAP BASE 分布式事务 本地事务 柔性事务和刚性事务 分布式一致性和分布式事务的理解 一致性协议 向量时钟 NWR ...

  5. 数据库 事务 四大特性 原子性Atomic 一致性Consistent 隔离性Insulation Isolation 持久性Duration 隔离级别

    https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BA%8B%E5%8A%A1/9744607?fr=aladdin 数据库事务 ...

  6. 数据库事务一致性的理解

    一致性的定义 百度百科-一致性: 一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的. 百度百科-事务一致性: 一个或多个事务执行后,原来一致的数据和数据库仍然是一致的.它主 ...

  7. 数据库和缓存一致性的问题

    经常看到有人问怎么解决数据库和缓存一致性的问题,这个问题我觉得是不要去解决. 如果你不信你先看我列的几种情况 假设 数据库一开始和缓存都是1元. 用户更新数据库的同时双写缓存. 1.双写不删 写库充值 ...

  8. 数据库事务的四大特性和隔离级别

    数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么全部执行,要么全部都不执行. 一个逻辑工作单元要成为事务,必须满足事务的四大特性(ACID).即 ...

  9. 一个事务中 可以查询自己未提交的数据吗_数据库事务的方方面面

    事务 是关系型数据的一个重要特性,但很少有人能对事务有全面性的了解,这篇文章就把事务的方方面面讲给你. 事务的概念 什么是事务 数据库事务(事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的 ...

最新文章

  1. Nova — 虚拟机密码修改
  2. linux 启动网卡错误 RTNETLINK answers: File exists 解决方案
  3. 《SpringMVC从入门到放肆》三、DispatcherServlet的url-pattern配置详解
  4. mysql replicate error
  5. mysql atlas 实现读写分离分担数据库压力
  6. ASP.NET学习笔记1—— MVC
  7. 让我们一起ML吧(一)聚类分析
  8. 网页设计课程设计报告
  9. highchart图表drilldown钻取功能及event点击事件添加(1)
  10. Android自定义View单TextView显示多种文字样式
  11. 服务器里的系统盘是什么意思,云服务器系统盘是什么意思
  12. 电压模块THM30-2421WI
  13. 中继器 网桥 路由器 网关
  14. 阿里云-云开发平台入门篇——静态网站的全生命周期实战
  15. python识别图像中的物体_OpenCV+Python 指定物体识别
  16. 浏览器调取摄像头人脸抓拍实现
  17. c语言Ox5516,采药 (C语言代码)
  18. Bowtie2错误:Could not locate a Bowtie index corresponding to basename /home/s45/mouse
  19. mysql 2038年问题_关于PHP转换超过2038年日期出错的问题解决
  20. 励志必看-------没有伞的孩子必须努力奔跑!

热门文章

  1. 和国内电池供应商ATL“一刀两断”,这回Note 8你还敢买吗?
  2. 防火墙详解(二)通过网页登录配置华为eNSP中USG6000V1防火墙
  3. 杭州联通主流套餐推荐
  4. Java实战新冠疫情统计系统——java毕设项目
  5. 使用森林优化算法的特征选择
  6. 王利阳:唯品会的“危机”与“反击”
  7. 20201021 goodsync
  8. 利用手机模块实现短消息
  9. Pygame游戏入门极简思维导图
  10. 科视Christie激光投影机点亮《九歌·山鬼》夜游景点