MySQL--事务,隔离性和隔离级别
事务
事务就是一组数据库操作,要么全部执行成功,要么全部执行失败,在MySQL中,事务是依靠存储引擎层实现的。
ACID(Atomicity,Consistency,Isolation,Durability)
原子性是指事务是不可再分的,是最小的工作单元。
一致性是指数据的完整性必须保持一致。
隔离性则是指多个用户并发访问数据库时,必须为每个用户开启一个事务,这些事务相互之间不受影响相互隔离。
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
四个特性之间不是平级关系:
1,只有满足一致性,事务的执行结果才是正确的,。
2,在无并发的情况下,事务串行执行,隔离性一定能够满足,此时只要能够满足原子性,那么就一定能够满足一致性。
3,在并发的情况下,多个事务并行执行,事务不仅要满足隔离性,还需要满足隔离性,才能满足一致性。
4,事务满足持久化是为了能应对系统崩溃的情况。
隔离级别
首先需要清楚的一点是,隔离得越严实,效率就会越低,因此许多时候是在这两者时间找寻平衡点。
隔离级别包括以下四个:
读未提交(READ UNCOMMITTED):是指一个事务未提交时,做的变更能被其他事务看到。
读提交(READ COMMITTED):是指一个事务提交之后,做的变更能被其他事务看到。
可重复读(REAPEATABLE READ):是指一个事务执行过程看到的数据,总是和这个事务启动时看到的数据是一致的,并且,未提交的变更对于其他事务也是不可见的。
串行化(SERIALIZABLE):是指对于同一行记录,写会对其加写锁,读会对其加读锁,当出现读写锁冲突的时候,后访问的事务必须等前一个事务完成才能继续执行。这也是级别最高的隔离级别。
煮个栗子
先假设数据表T中只有一列,其中一行值为1,那么对于不同的隔离级别,表格中的V1V2V3的值就会有不同。
1,对于读未提交,那么B虽然没有提交但是B做的修改可以被A看到,所以V1查出来是就是修改后的2了,那么自然V2也是2,V3也是2;
2,对于读提交,那么B在没提交之前做的修改A都是看不到的,所以V1仍然是1,但是在查V2之前B提交了,所以V2等于2,V3也等于2;
3,对于可重复读,意味着一个事务执行期间看到的值都是一样的,在启动时查询到的值为1,那么在A未提交前看到的都是1,所以V1V2都是1,V3为2;
4,对于串行化,因为A在B之前查询到1,所以在B进行修改时,并不能继续往下,而是必须等待A执行结束,所以V1V2都是1,V3为2;
查询自己数据库的隔离级别:
SHOW VARIABLES LIKE 'transaction_isolation';
事务隔离的实现:
在MySQL中,实际上每一条记录在更新的时候都会同时记录一条回滚的记录,记录上最新的值,通过回滚能找到前一个状态下的值,在不同的时刻
启动的事务就会有不同的read-view,同一条记录在系统中可以存在很多个版本。煮个栗子:(图片来自丁奇的MySQL45讲)
从左往右看,就是1按顺序被修改为2,3,4,在回滚日志中能看到上图这样的记录,
在视图A,B,C里面,此记录的值是1,2,4。此时即使有另一个事务正在将4再改成5,这个事务跟read-viewA,B,C对应的事务不会冲突的。
详细的原理本人还没有进行深入了解,如果日后学到了再补上。
事务的启动方式:
显式启动:start transaction/begin,配套提交语是commit,回滚是rollback
将自动提交关闭即set autocommit=0,意味着如果你执行一个select语句,这个事务就启动了,并不会自动提交,直到手动commit或者rollback,
或者断开连接。这种自然是不好的,因为客户端如果跟MySQL一直是长连接,那么就导致长事务,长事务会导致系统里面有许多老的事务视图。
且这些事务视图可以访问数据库中的任何数据,事务提交之前的所有的回滚记录都会得到保留,占用大量存储空间。除此之外,长事务也占用
锁资源,对库的性能有很大影响。
MySQL--事务,隔离性和隔离级别的更多相关文章
- mysql 隔离性与隔离级别
提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务.最经典的例子就是转账,你要给朋友小王转 100 块钱,而此时你的银行卡只有 100 块钱. 转账过程具体到程序里会有一系列的操作,比如 ...
- MySQL事务及实现、隔离级别及锁与优化
事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.事务是逻辑上的一组操作,要么都执行,要么都不执行. ACID简介 原子性(Atomicity) ...
- 事务传播性、隔离性与MVCC
一.事务传播性 1.1 什么是事务的传播性 事务的传播性一般在事务嵌套时候使用,比如在事务A里面调用了另外一个使用事务的方法,那么这俩个事务是各自作为独立的事务执行提交,还是内层的事务合并到外层的事务 ...
- MySQL事务的四种隔离级别
事务的基本要素: 原子性(atomicity):事务开始后的全部操作, 要么全部执行成功,如果中间出现错误,事务回滚到事务开始前的状态. 一致性(Consistency):事务开始后,数据库的完整性约 ...
- 粗谈MySQL事务的特性和隔离级别
网上对于此类的文章已经十分饱和了,那还写的原因很简单--作为自己的理解笔记. 前言 此篇文章作为自己学习MySQL的一些个人理解,使用的引擎是InnoDb.首先先讲讲事务的概念,在<高性能 ...
- SqlServer事务详解(事务隔离性和隔离级别详解)
概述 不少人对于事务的使用局限于begin transaction:开始事务.commit transaction:提交事务.rollback transaction:回滚事务的初步运用. 并且知道使 ...
- Spring的事务传播性与隔离级别以及实现事物回滚
一.事务的四个特性(ACID) 原子性(Atomicity):一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做,要么全部做. 一致性(Consistency): 数据不会因为事务的执行而 ...
- spring事务传播性与隔离级别
事务的7种传播级别: 1)PROPAGATION_REQUIRED:支持当前事务,没有事务就新建一个. 2)PROPAGATION_SUPPORTS:支持当前事务,如果没有事务,以非事务方式处理 3) ...
- mysql 事务,锁,隔离机制
mysql架构 锁 为了解并发问题,引入锁,mysql中锁分为读锁和写锁,即share lock和exclusive lock.故名思义,share lock之间不互斥,share lock和excl ...
随机推荐
- 解决Elasticsearch索引只读
今天添加索引时发现kibana添加索引不生效,页面也没有报错,没有创建成功只是一闪而过. 另外发现各项目日志与当前时间差异很大,filebeat一直报错io timeout 具体报错如下: fileb ...
- NRF52840与NRF52832的性能区别
蓝牙版本的不断更新,大部分客户慢慢都向往着蓝牙5.0.当然对于前不久NORDIC刚出的蓝牙5.0 NRF52840,很多人都还不是很了解.NRF52840可以说是NRF52832的超强升级版,虽然同样 ...
- 三十四、在SAP的屏幕选择中,将英文替换成我们想要的文本内容
一.我们在代码中定义了一个选择屏幕,但是对应的显示界面为英文 界面如下 二.我们选择[转到]-[文本元素] 三.默认的文本内容是问号和三个点 四.我们修改成我们需要的,并激活这个文本,如果不激活会丢失 ...
- idea新建maven web项目
一.新建maven web项目 二.配置服务器 三.测试运行
- kibana下载与安装
目录 简介 下载 安装 测试 简介 Kibana是一个为ElasticSearch 提供的数据分析的 Web 接口.可使用它对日志进行高效的搜索.可视化.分析等各种操作.安装之前有话说: 安装路径不要 ...
- (java) webdriver 启动firefox driver时,加载firebug的扩展
去网上下载一个firebug.xpi(对应版本, 我的ff是17,可以使用firebug-1.11.4.xpi,最好使用非firefox浏览器下载,不然提示你直接安装到firefox) @Before ...
- linux----查看系统版本命令
uname -a 可显示电脑以及操作系统的相关信息 cat /proc/version 说明正在运行的内核版本 cat /etc/issue 显示的是发行版本信息
- ssi引用路径规则
1.file:引用的是相对路径,相对当前文件的,特别注意使用file,被引用文件只能与当前文件同级.或下级.不能在其上级(不支持../) <!--#include file="head ...
- C++基础--随机数
C/C++要产生随机数的方法一般是采用rand()函数核srand()函数来实现的. rand()函数返回的是一个伪随机数,这个函数内部采用线性同余法来实现伪随机数,而这个伪随机数是在一定范围内可以看 ...
- python里的反射(自学习)
在做程序开发中,我们常常会遇到这样的需求:需要执行对象里的某个方法,或需要调用对象中的某个变量,但是由于种种原因我们无法确定这个方法或变量是否存在,这是我们需要用一个特殊的方法或机制要访问和操作这个未 ...