数据库中经常被问到四大特性和隔离级别,一般都是涉及到概念性问题,在此做一些整理总结,方便理解。

1、事务的隔离级别

由低到高依次为Read uncommitted(未授权读取、读未提交)、Read committed(授权读取、读提交)、Repeatable read(可重复读取)、Serializable(序列化),这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。

(1)Read uncommitted(未授权读取、读未提交):

1)其他事务读未提交数据,出现脏读;
2)如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。
3)避免了更新丢失,却可能出现脏读。也就是说事务B读取到了事务A未提交的数据。
(读未提交:一个事务写数据时,只允许其他事务对这行数据进行读,所以会出现脏读,事务T1读取T2未提交的数据)

(2)Read committed(授权读取、读提交):

1)允许写事务,所以会出现不可重复读
2)读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
3)该隔离级别避免了脏读,但是却可能出现不可重复读。事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。
(读已提交:读取数据的事务允许其他事务进行操作,避免了脏读,但是会出现不可重复读,事务T1读取数据,T2紧接着更新数据并提交数据,事务T1再次读取数据的时候,和第一次读的不一样。即虚读)

(3)Repeatable read(可重复读取):

1)禁止写事务;
2)读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。
3)避免了不可重复读取和脏读,但是有时可能出现幻读。这可以通过“共享读锁”和“排他写锁”实现。
(可重复读:读事务会禁止所有的写事务,但是允许读事务,避免了不可重复读和脏读,但是会出现幻读,即第二次查询数据时会包含第一次查询中未出现的数据)

(4)Serializable(序列化):

1)禁止任何事务,一个一个进行;
2)提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
3)序列化是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读。

2、出现的问题:

当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性,在介绍数据库提供的各种隔离级别之前,我们先看看如果不考虑事务的隔离性,会发生的几种问题:脏读、不可重复读、幻读。

(1)脏读

1.脏读定义:

  1)说法1:指在一个事务处理过程里读取了另一个未提交的事务中的数据,读取数据不一致。
  2)说法2:指事务A对数据进行增删改操作,但未提交,另一事务B可以读取到未提交的数据。如果事务A这时候回滚了,则第二个事务B读取的即为脏数据。

2.举例:

  当一个事务正在多次修改某个数据,而在这个事务中多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。
例如:用户A向用户B转账100元,对应SQL命令如下
  update account set money=money+100 where name=’B’; (此时A通知B)
  update account set money=money - 100 where name=’A’;
当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时即发生了脏读),而之后无论第二条SQL是否执行,只要该事务不提交,则所有操作都将回滚,那么当B以后再次查看账户时就会发现钱其实并没有转。

(2)不可重复读

1.不可重复读定义:

  1)说法1:是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
  2)说法2:一个事务A中发生了两次读操作,第一次读操作和第二次读操作之间,另一个事务B对数据进行了修改,这时两个事务读取的数据不一致。

2.举例:

  例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。

3.不可重复读和脏读的区别:

  脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
  在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,例如对于同一个数据A和B依次查询就可能不同,A和B就可能打起来了……

(3)虚读(幻读)

1.幻读定义:

  1)说法1:是事务非独立执行时发生的一种现象。
  2)说法2:第一个事务A对一定范围的数据进行批量修改,第二个事务B在这个范围增加一条数据,这时候第一个事务就会丢失对新增数据的修改。

2.举例:

  例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。

3.幻读和不可重复读区别:

  都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

3、MySQL数据库提供的四种隔离级别:

•   ① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
•   ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
•   ③ Read committed (读已提交):可避免脏读的发生。
•   ④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。

  以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。
  在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。
1)在MySQL数据库中查看当前事务的隔离级别:

select @@tx_isolation;

2)在MySQL数据库中设置事务的隔离 级别:

set  [glogal | session]  transaction isolation level 隔离级别名称;
set tx_isolation=’隔离级别名称;’

例1:查看隔离级别:

例2:将事务的隔离级别设置为(Repatable read)可重复读或者Read uncommitted级别:
或者
注意:设置数据库的隔离级别一定要是在开启事务之前!
  如果是使用JDBC对数据库的事务设置隔离级别的话,也应该是在调用Connection对象的setAutoCommit(false)方法之前。调用Connection对象的setTransactionIsolation(level)即可设置当前链接的隔离级别,至于参数level,可以使用Connection对象的字段:
在JDBC中设置隔离级别的部分代码:

4、事务的四大特性

数据库中事务的四大特性(ACID):原子性、一致性、隔离性、持久性。如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性:

(1)原子性(Atomicity)

  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

(2)一致性(Consistency)

  一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
  如:拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

(3)隔离性(Isolation)

  隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
  即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

(4)持久性(Durability)

  持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
  例如:我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

后记:其实说来说去也就三方面的概念
1)四大隔离级别:串行化、可重复读、读已提交、读未提交;
2)四大特性(ACID):原子性、一致性、隔离性、持久性;
3)三个问题:脏读、不可重复度、幻读;

数据库的四大特性和事务隔离级别相关推荐

  1. 数据库事务的四大特性及事务隔离级别

    概要: 事务的四个特性:原子性.一致性.隔离性.持久性 事务不隔离带来的问题:更新丢失.脏读.不可重复读.虚读(幻读).其中更新丢失就是并发写,这是一定不允许的,因此一定要解决更新丢失问题. 事务隔离 ...

  2. 什么是事务、事务特性、事务隔离级别、spring事务传播特性

    1.什么是事务: 事务是指程序中的一个操作序列.其特点是:该序列的所有操作要么全部成功完成,要么只要有一个操作失败,则该序列所有操作都将被撤销.这也是事务的原子性(要么成功,要么失败). 2.事务特性 ...

  3. 深入理解Mysql事务ACID特性以及事务隔离级别

    事务的概念: 1.事务是一组sql语句的执行,要么全部成功,要么全部失败.保证事务执行的原子性. 2.事务的全部sql语句执行成功,才能提交,将结果写回到磁盘上. 3.事务执行过程中,有的SQL执行失 ...

  4. java 一个大事务下的新增、修改、查询_重新学习Mysql数据库8:MySQL的事务隔离级别实战...

    本文转自:https://blog.csdn.net/sinat_27143551/article/details/80876127 本系列文章将整理到我在GitHub上的<Java面试指南&g ...

  5. 数据库的四大特性以及事务的隔离级别

    什么是事务 什么是事务? 当多个操作有这样的要求时:要么都成功要么都失败,这说明这多个操作必须在一个事务中,事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit ...

  6. MySQL事务的特性及事务隔离级别演示

    事务的概述 事务的概念 事务:指的是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么全都成功,要么全都失败. MySQL中的事务管理 环境准备 create table account( id in ...

  7. MySQL 事务特性以及事务隔离级别

    事务的概念 数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成. 事务特性(ACID) 事务拥有四个重要的特性: 原子性(Atomicity) 事务开始后 ...

  8. 【概念原理】四种SQL事务隔离级别和事务ACID特性

    2019独角兽企业重金招聘Python工程师标准>>> 事务是一组读写操作,并且具有只有所有操作都成功才算成功的特性. 事务隔离级别 SQL事务隔离级别由弱到强分别是:READ_UN ...

  9. 数据库事务隔离级别+Spring 声明性事务隔离级别

    数据库事务隔离级别 数据库提供了四种事务隔离级别, 不同的隔离级别采用不同的锁类开来实现. 在四种隔离级别中, Serializable的级别最高, Read Uncommited级别最低. 大多数数 ...

最新文章

  1. 检查Java中的字符串是空还是空[重复]
  2. 大话数据结构08:共享栈 C++
  3. Gartner:缺乏技术人才将影响企业数字化转型
  4. Properties文件的XML格式
  5. 浅谈深拷贝 与 浅拷贝
  6. Leetcode每日一题:3.无重复字符的最长子串
  7. VB将自定义资源中的文件释放出来
  8. python机器学习案例系列教程——算法总结
  9. 基于springboot网上书城系统
  10. excel打不开_卸载WPS以后为什么无法打开一个新建的Excel工作簿了
  11. 将一个文件夹下的多个目录生成txt文本,并且写入到Excel中
  12. 分布式 - 公司使用什么RPC框架,聊聊你理解的RPC原理
  13. 宜品优享抽奖系统小程序,多方式真是展示抽奖功能
  14. GeoMesa 详细介绍
  15. Linux 笔试面试常见题目(整理)
  16. ID基本操作(标尺,参考线,网格)5.11
  17. 操作系统中文件系统-文件的分类
  18. 数字IC设计学习笔记_静态时序分析STA_伪路径False Paths
  19. 雷军伯乐:天才程序员求伯君的退休生活
  20. 深入PHP语法(1)

热门文章

  1. RepPoints(本质是可变形卷积DCN)再理解
  2. idea maven没有setting.xml_Maven最全视频教程-彻底搞定项目管理利器maven!
  3. 戴尔服务器t110做系统,戴尔服务器T110
  4. php 生存分析,HPA数据库08.做生存分析
  5. java直接读取rar,Java无需解压直接读取Zip文件和文件内容
  6. java那一年出来的_输入某年某月某日 判断其是那一年的第多少天
  7. js,在字符串中,查找某个字符的位置
  8. vue函数input输入值即请求,优化为用户输入完成之后再请求
  9. java设计模式并发_[高并发Java 七] 并发设计模式
  10. Fusionapp历史记录加收藏夹加清除缓存.fas源码