事务四大特性&脏读、幻读、不可重复读的区别&事务的隔离级别

一、什么是事务

事务:是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元);

二、事务的四大特性

  • 1.原子性:强调事务的不可分割。事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
  • 2.一致性:事务的执行的前后数据的完整性保持一致。事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。
  • 3.隔离性:一个事务执行的过程中,不应该受到其他事务的干扰,一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 4.持续性: 事务一旦结束,数据就持久到数据库,也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。

三、没有对事务进行隔离时会发生哪些危害了 ?(并发事务带来哪些问题)

1、脏读(读取了未提交的数据,针对单笔数据)

脏读就是指当一个事务正在访问数据,并且对数据进行修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
e.g
      1.阿基的原工资为1000,财务人员将阿基的工资改为8000(但未提交事务)
      2.阿基读取自己的工资,发现自己的工资变为8000,欢天喜地!决定请大家吃饭
      3.而财务发现操作有误,回滚了事务,阿基的工资又变为了1000
      像这样,我记取的工资数8000是一个脏数据。      

2、不可重复读(进行了读取,分别读取了不同的数据,重点在于修改和删除,也是针对单笔数据)

是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的俩次读数据之间,由于第二个事务的修改,那么第一个事务俩次读到的数据可能是不一样的。这样在一个事务内俩次读到的数据是不一样的。因此称为是不可重复读。
e.g
      1.在事务1中,我读取到自己的工资为1000,操作并没有完成
      2.在事务2中,这时财务人员修改了我的工资为2000,并提交了事务。
      3.在事务1中,我再次读取自己的工资时,工资变为2000
解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题。

3、幻读(进行了读取,分别读取了不同的数据,重点在于新增,针对多笔数据)

是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改了这个表中的数据,这种修改是向表中插入了一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好像发生了幻觉一样
e.g
      目前工资为1000的员工有10人。
      1.事务1读取所有工资为1000的员工
      2.这时事务2向employee表插入了一条员工记录,工资为1000
      3.事务1再次读取所有工资为1000的员工共读取到了11条记录。
解决办法:如果在操作事务完成数据处理之前,任何其他事务都不可以添加新数据,则可避免该问题

4、丢失修改

指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据,第二个数据也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。
e.g
      事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改了A=A-1,事务2也修改了A=A-1,最终结果A=19,事务1的修改被丢失。

四、事务隔离级别有哪些?

SQL标准定义了四个隔离级别:

  • READ-UNCOMMITTED(读取未提交):最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
  • READ-COMMITTED(读取已提交):允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
  • REPEATABLE-READ(可重复读):对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
  • SERIALIZABLE(可串行化):最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。

    MySQL InnoDB存储引擎的默认支持的隔离级别是REPEATABLE-READ(可重读)。
posted @ 2020-10-28 00:16  爱写代码的基  阅读(531)  评论(0编辑  收藏  举报