「DB」数据库事务的隔离级别
*博客搬家:初版发布于 2017/04/10 00:37 原博客地址:https://my.oschina.net/sunqinwen/blog/875833
数据库事务的隔离级别
讲事务的隔离级别之前,先来介绍一下数据库事务的几个特性:
(1)原子性
最基本的特性,意思是在一个事务内里所有关于数据库的操作,要么全部成功,要么全部失败;成功时意味着本次操作所有数据库相关的写操作全部持久化,无法更改,失败意味着本次操作相对于操作前对数据库没有任何影响和改变。
(2)一致性
指的是一次完整的事务必须将数据库的一个一致状态转变到另外一个一致状态。
一致性写:
例如:事务A要做的操作是将A、B、C三个记录修改为D、E、F,那么A、B、C----->D、E、F的过程就满足了事务一致性,但是如果出现类似:A、B、C---->D、E、C(A、B修改成功,但是C未修改)则认定违背了事务的一致性,简单理解一致性就是指事务的“初始状态”到“修改完成状态”与“目标状态一致”。
一致性读:
事务A在某一刻发起查询请求,那么查询结果是以那一刻为准,保证了数据在查询一刻的一致性。
(3)持久性
指一次事务的成功提交对数据库造成的修改是永久性的。
(4)隔离性
当多个用户并发访问数据库时,数据库为每一个用户开启的事务不可以被其他事务所影响,也就是说并发事务间要相互独立不受到干扰。关于隔离性分了集中隔离等级,本篇文章将详细介绍这几种隔离等级。
下面来讲下事务隔离级别:
(1)Read Uncommitted(读未提交)
这个隔离级别下未被提交的事务下所做的任何操作都可以被其他事务所读取到,这时候会造成数据的脏读、幻读、不可重复读问题。
(2)Read Committed(读已提交)
这个隔离级别下未被提交的操作不可以被其他事务所读取到,简单来讲就是单个事务里的内容在事务成功提交之前,是不会被其他事务所读取(发现)到的,但是这样同样会出现幻读、不可重复读现象。
举个栗子:事务T1要对C表做添加操作,同时事务T2里要读取C表,T2第一次读取C表时返回1条数据,这时T1执行完毕,那么T2如果再次取一次C表数据就会发现多出一条数据。
(3)Repeatable Read(可重读)
Mysql默认的隔离级别,这个隔离级别下同一事务读取到的数据一致(简单点说就是T1一旦开始,读取到数据如果中间被T2修改,那么T1再次读取该数据是和第一次读取时一样的),因此,在该隔离级别下,不会造成脏读、不可重复读,但依旧会造成幻读现象。
(4)Serializable(串行化)
最高隔离级别,会为每个事务排序(为每条数据都加上锁),使之执行串行化,不可能产生冲突,因此解决了脏读、幻读、不可重复读问题,但是会造成锁竞争甚至超时,一般不会采用这种极端的隔离机制。
事务并发过程中产生的问题介绍:
(1)脏读
一个事务读取到了另外一个事务中未提交的数据。
(2)不可重复读
一个事务读取到了另外一个事务中提交的修改掉的数据。
(3)幻读
一个事务读取到了另外一个事务中添加的数据。
Tip:不可重复读和幻读的区别在于着重点一个是update,一个是insert
总结四种隔离级别所造成和避免的问题,请先看以上内容后再看此表:
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
| Read Uncommitted | 是 | 是 | 是 |
| Read Committed | 否 | 是 | 是 |
| Repeatable Read | 否 | 否 | 是 |
| Serializable | 否 | 否 | 否 |
「DB」数据库事务的隔离级别的更多相关文章
- MySQL数据库事务各隔离级别加锁情况--read uncommitted篇(转)
本文转自https://m.imooc.com/article/details?article_id=17291,感谢作者 1.目的 1.1 合适人群 1.数据库事务特征我只是背过,并没有很深刻的理解 ...
- Mysql数据库事务的隔离级别和锁的实现原理分析
Mysql数据库事务的隔离级别和锁的实现原理分析 找到大神了:http://blog.csdn.net/tangkund3218/article/details/51753243 InnoDB使用MV ...
- Spring中事务的传播行为,7种事务的传播行为,数据库事务的隔离级别
Propagation.REQUIRED 代表当前方法支持当前的事务,且与调用者处于同一事务上下文中,回滚统一回滚(如果当前方法是被其他方法调用的时候,且调用者本身即有事务),如果没有事务,则自己新建 ...
- MySQL数据库事务各隔离级别加锁情况--read committed && MVCC(转载)
http://www.imooc.com/article/17290 http://www.51testing.com/html/38/n-3720638.html https://dev.mysql ...
- MySQL数据库事务各隔离级别加锁情况--read committed && MVCC(转)
本文转自https://m.imooc.com/article/details?article_id=17290 感谢作者 上篇记录了我对MySQL 事务 隔离级别read uncommitted的理 ...
- 数据库事务ACID/隔离级别
参考博客 1. 事务的定义 事务是用户定义的一个数据库操作序列.这些操作要么全执行,要么全不执行,是一个不可分割的工作单元.在关系型数据库中,事务可以是一条SQL语句,也可以是一组SQL语句或整个程序 ...
- 通过pymysql程序debug学习数据库事务、隔离级别
问题 今天在使用pymysql连数据库的时候,出现了一个bug,查询数据库某个数据,但是在我在数据库中执行sql语句改变数据后,pymsql的查询依然没有发生改变. 代码如下: # 5.6.10 co ...
- Mysql数据库事务及隔离级别学习测试
参考了这篇文章的一些内容: http://xm-king.iteye.com/blog/770721 记住以下这张表: 我在springdemo库里面建了一个表: CREATE TABLE `tx` ...
- MySQL数据库事务各隔离级别加锁情况--Repeatable Read && MVCC(转)
本文转自https://m.imooc.com/article/details?article_id=17289 感谢作者 上节回顾 上两篇记录了我对MySQL 事务 隔离级别read uncommi ...
随机推荐
- R语言笔记完整版
[R笔记]R语言函数总结 R语言与数据挖掘:公式:数据:方法 R语言特征 对大小写敏感 通常,数字,字母,. 和 _都是允许的(在一些国家还包括重音字母).不过,一个命名必须以 . 或者字母开头, ...
- mysql user表 权限字段详解
Select_priv.确定用户是否可以通过SELECT命令选择数据. Insert_priv.确定用户是否可以通过INSERT命令插入数据. Update_priv.确定用户是否可以通过UPDATE ...
- SQL日期跟时间值序列
与数据操作相关的场景要生成日期和时间序列,序列的范围是从输入值@start到@end,且具有一定的时间间隔.这样的场景包括填充数据仓库中的时间维度.应用程序的运行时间安排以及其他.可以借助http:/ ...
- 【转载】mysql常用函数汇总
转载地址:http://www.jb51.net/article/40179.htm 一.数学函数ABS(x) 返回x的绝对值BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制 ...
- 马尔可夫决策过程MDP
1. 马尔可夫模型的几类子模型 马尔科夫链(Markov Chain),了解机器学习的也都知道隐马尔可夫模型(Hidden Markov Model,HMM).它们具有的一个共同性质就是马尔可夫性(无 ...
- Introduction MBG
文档地址 http://www.mybatis.org/generator/configreference/xmlconfig.html 源码地址 https://github.com/mybatis ...
- css3系列之animation
在上次博文中已经讲了transition,其实animation与transition功能相同,都是通过改变元素 的属性来实现动画效果的.但是它们也有区别:transition是只能通过改变指定属性的 ...
- 编写高质量代码改善C#程序的157个建议——建议131:用PascalCasing命名公开元素
建议131:用PascalCasing命名公开元素 开放给调用者的属性.字段和方法都应该采用PascalCasing命名方法,比如: class Person { public string Firs ...
- MySQL中如何为查询的数据添加自增序号、顺序呢?
背景介绍 很多时候我们在使用mysql查询数据的时候都会遇到一个问题,就是查询出来了一堆数据,但是查询的数据的表并没有序号,然而部分数据库显示工具是有外带序号显示,但是这种序号不是由sql产生的,而是 ...
- 基于NIOS II的双端口CAN通信回环测试
基于NIOS II的双端口CAN通信回环测试 小梅哥编写,未经授权,严禁用于任何商业用途 说明:本稿件为初稿,如果大家在使用的过程中有什么疑问或者补充,或者需要本文中所述工程源文件,欢迎以邮件形式发送 ...