数据库事务和一致性处理
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
数据库事务和一致性处理相关推荐
- 简单理解mysql事务_如何理解数据库事务中的一致性的概念?
比较支持@Kai Peng 的答案,只是缺少例子说明. 而其他一些人的答案甚至有明显的错误.最近正好也在研究这方面的东西,不算是回答,就是跟大家讨论讨论. 首先,我们需要搞清楚为什么会出现事务.[1] ...
- mysql数据库事务的概念_如何理解数据库事务中的一致性的概念?
比较支持@Kai Peng 的答案,只是缺少例子说明. 而其他一些人的答案甚至有明显的错误.最近正好也在研究这方面的东西,不算是回答,就是跟大家讨论讨论. 首先,我们需要搞清楚为什么会出现事务.[1] ...
- mysql 事务原子性_数据库事务原子性、一致性是怎样实现的?
先借用前辈的一句话:数据库事务有不同的隔离级别,不同的隔离级别对锁的使用是不同的,锁的应用最终导致不同事务的隔离级别. 隔离性分为四个级别: 1读未提交:(Read Uncommitted) 2读已提 ...
- 数据库事务、分布式一致性和分布式事务
文章目录 什么是事务 事务(ACID)的特性 对事务一致性的理解 分布式一致性 CAP BASE 分布式事务 本地事务 柔性事务和刚性事务 分布式一致性和分布式事务的理解 一致性协议 向量时钟 NWR ...
- 数据库 事务 四大特性 原子性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 数据库事务 ...
- 数据库事务一致性的理解
一致性的定义 百度百科-一致性: 一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的. 百度百科-事务一致性: 一个或多个事务执行后,原来一致的数据和数据库仍然是一致的.它主 ...
- 数据库和缓存一致性的问题
经常看到有人问怎么解决数据库和缓存一致性的问题,这个问题我觉得是不要去解决. 如果你不信你先看我列的几种情况 假设 数据库一开始和缓存都是1元. 用户更新数据库的同时双写缓存. 1.双写不删 写库充值 ...
- 数据库事务的四大特性和隔离级别
数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么全部执行,要么全部都不执行. 一个逻辑工作单元要成为事务,必须满足事务的四大特性(ACID).即 ...
- 一个事务中 可以查询自己未提交的数据吗_数据库事务的方方面面
事务 是关系型数据的一个重要特性,但很少有人能对事务有全面性的了解,这篇文章就把事务的方方面面讲给你. 事务的概念 什么是事务 数据库事务(事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的 ...
最新文章
- Nova — 虚拟机密码修改
- linux 启动网卡错误 RTNETLINK answers: File exists 解决方案
- 《SpringMVC从入门到放肆》三、DispatcherServlet的url-pattern配置详解
- mysql replicate error
- mysql atlas 实现读写分离分担数据库压力
- ASP.NET学习笔记1—— MVC
- 让我们一起ML吧(一)聚类分析
- 网页设计课程设计报告
- highchart图表drilldown钻取功能及event点击事件添加(1)
- Android自定义View单TextView显示多种文字样式
- 服务器里的系统盘是什么意思,云服务器系统盘是什么意思
- 电压模块THM30-2421WI
- 中继器 网桥 路由器 网关
- 阿里云-云开发平台入门篇——静态网站的全生命周期实战
- python识别图像中的物体_OpenCV+Python 指定物体识别
- 浏览器调取摄像头人脸抓拍实现
- c语言Ox5516,采药 (C语言代码)
- Bowtie2错误:Could not locate a Bowtie index corresponding to basename /home/s45/mouse
- mysql 2038年问题_关于PHP转换超过2038年日期出错的问题解决
- 励志必看-------没有伞的孩子必须努力奔跑!