MySQL事务,事务隔离级别详解
1、什么是事务
指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
2、事务的4个特性
原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
3、每个特性的意思
。原子性
原子性是指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。
如,A向B转钱,在事务中的扣款和加款两条语句,要么都执行,要么都不执行。
。一致性
一致性是指事务使得系统从一个一致的状态转换到另一个一致状态。
如,A和B存款总额为1000,A向B转钱,无论失败,最终A和B的存款总额依然为1000.
。隔离性
多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。
数据库多个事务之间操作可能出现的问题以及事务隔离级别是这篇文章介绍的重点。
。持久性
持久性,意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
即使出现了任何事故比如断电等,事务一旦提交,则持久化保存在数据库中。
4、事务并发产生的问题
。脏读(dirty read)
一个事务读取到了另外一个事务没有提交的数据
事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
。不可重复读(nonrepeatable read)
在同一事务中,两次读取同一数据,得到内容不同
事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致
。幻读(phantom read)
同一事务中,用同样的操作读取两次,得到的记录数不相同
系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样
5、MySQL的4种隔离级别
。Read Uncommitted(读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。
读取未提交的数据,则会发生赃读
。Read Committed(读取提交内容)
一个事务只能看见已经提交事务所做的改变。这是大多数数据库系统的默认隔离级别,但非MySql
一个事务多次读取的过程中,另一个事务可能对同一条数据做修改并提交,导致前一个事务多次读取到的数据不一致,则会发生不可重复读
。Repeatable Read(可重读)
它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。这是MySql的默认隔离级别
但,此级别依然会发生幻读
。Serializable(可串行化)
它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题
隔离级别 | 读数据一致性 | 赃读 | 不可重复读 | 幻读 |
---|---|---|---|---|
Read Uncommitted | 最低级别,只能保证不读取物理上损坏的数据 | √ | √ | √ |
Read Committed | 语句级 | × | √ | √ |
Repeatable Read | 事务级 | × | × | √ |
Serializable | 最高级别,事务级 | × | × | × |
总结
。事务用来管理 insert,update,delete 语句
。事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行
。在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
。低级别的隔离一般支持更高的并发处理,并拥有更低的系统开销。高级别的隔离可靠性较高,但系统开销较大。
。mysql中默认事务隔离级别是可重复读时并不会锁住读取到的行。
。事务隔离级别为读提交时,写数据只会锁住相应的行。
。事务隔离级别为可重复读时,如果有索引(包括主键索引)的时候,以索引列为条件更新数据,会存在间隙锁间隙锁、行锁、下一键锁的问题,从而锁住一些行;如果没有索引,更新数据时会锁住整张表
。事务隔离级别为串行化时,读写数据都会锁住整张表
。隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大,鱼和熊掌不可兼得啊。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。
参考
https://segmentfault.com/a/1190000014837747#articleHeader0 https://segmentfault.com/a/1190000014811125 http://blog.itpub.net/31559358/viewspace-2221931/
仅供自己 温故而知新
MySQL事务,事务隔离级别详解的更多相关文章
- MySQL事务及隔离级别详解
MySQL事务及隔离级别详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的基本架构 MySQL的基本架构可以分为三块,即连接池,核心功能层,存储引擎层. 1> ...
- SQL Server事务、隔离级别详解(二十九)
前言 事务一直以来是我最薄弱的环节,也是我打算重新学习SQL Server的出发点,关于SQL Server中事务将分为几节来进行阐述,Always to review the basics. 事务简 ...
- SQL Server-聚焦事务、隔离级别详解(二十九)
前言 事务一直以来是我最薄弱的环节,也是我打算重新学习SQL Server的出发点,关于SQL Server中事务将分为几节来进行阐述,Always to review the basics. 事务简 ...
- MySQL 四种隔离级别详解,看完吊打面试官
转发链接:https://zhuanlan.zhihu.com/p/76743929 什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就 ...
- mysql 事务隔离级别 详解
问题 在工作中真实遇到的问题:用python连接mysql,查询数据,同时有别的代码在更新mysql中的数据,前者是一直是保持连接的数据库,每一分钟select一次,但第二次却查不到更新后的数据?wh ...
- mysql 事务隔离级别详解
事物的 隔离级别,说简单非常简单(新手也能说出 是个隔离级别 和 影响),说男也非常难.(很多 有几年编程 经验的程序员依旧搞不清楚) 废话不多少 直接开始: 事务的隔离级别 是用来描述 事务的读关系 ...
- MySQL 四种事务隔离级别详解及对比--转
http://www.jb51.net/article/100183.htm 接的隔离级别.它的语法如下: ? 1 SET [SESSION | GLOBAL] TRANSACTION ISOLATI ...
- mysql事务_事务隔离级别详解
使用事务语法 1. 开启事务start transaction,可以简写为 begin 2. 然后记录之后需要执行的一组sql 3. 提交commit 4. 如果所有的sql都执行成功,则提交,将sq ...
- SqlServer事务详解(事务隔离性和隔离级别详解)
概述 不少人对于事务的使用局限于begin transaction:开始事务.commit transaction:提交事务.rollback transaction:回滚事务的初步运用. 并且知道使 ...
随机推荐
- myisam和innodb的区别对比
1.MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.不 ...
- VS Code & MacOS & Zsh
VS Code & MacOS & Zsh https://code.visualstudio.com/docs/setup/mac solution OK bug $ cat .zs ...
- Yii2的save()方法容易出错的地方
如果save()返回true, 但是数据没有保存成功,则应该是开启了事务且已经回滚 如果save()返回false, 则使用$model->errors查看错误原因 可以设置$model的场景, ...
- AngularJS从入门到精通
第一 AngularJS的四大特性 1. MVC 例如:使用angularjs向模板传递数据 <!doctype html> <html> <head> <m ...
- mysql “Too many connections” 解决办法
今天生产服务器上的MySQL出现了一个不算太陌生的错误“Too many connections”.平常碰到这个问题,我基本上是修改/etc/my.cnf的max_connections参数,然后重启 ...
- 基于 vue+vue-router+vuex+axios+koa+koa-router 本地开发全栈项目
因为毕业设计要做基于Node服务器的项目,所以我就想着用刚学的vue作为前端开发框架,vue作为Vue.js应用程序的状态管理模式+库,axios基于promise用于浏览器和node.js的http ...
- 【C/C++】c文件重点总结
c文件重点知识总结 程序文件数据文件--->分文本文件(ASCII文件)和映像文件(二进制文件) .区分是用记事本打开后能否看懂. 用二进制文件读写花费时间少,因为用文本文件需要有一个转换的过程 ...
- ng-click 发两次ajax请求的原因及解决方法
http://blog.csdn.net/anmo/article/details/17083125
- Mail.Ru Cup 2018 Round 2
A:阅读理解. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...
- 微信小程序——使用vue构建小程序【外传】
文档 http://mpvue.com/mpvue/ 根据文档构建完成的页面如下 更多的,还要继续看下文档~