美文网首页
数据库之隔离级别,脏读幻读,事务特性

数据库之隔离级别,脏读幻读,事务特性

作者: 上善若泪 | 来源:发表于2024-02-05 16:23 被阅读0次

1 事务隔离级别

1.1 默认隔离级别

ISOLATION_DEFAULT: 默认隔离级别 ,这是一个PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别,
oracle默认的是.:READ_COMMITTEDmysql默认的是:REPEATABLE_READ

1.2 读未提交

ISOLATION_READ_UNCOMMITTED:读未提交,这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。
这种隔离级别会产生脏读,不可重复读和幻像读。

1.3 读已提交

ISOLATION_READ_COMMITTED:读已提交,保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。
这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。

1.4 可重复读

ISOLATION_REPEATABLE_READ:可重复读 ,这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。
它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免不可重复读的情况产生。

1.5 序列化

ISOLATION_SERIALIZABLE:序列化,这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。
除了防止脏读,不可重复读外,还避免了幻像读。

2 事务关键词

2.1 定义(脏读,不可重复读,虚读)

  • 脏读:指一个事务读取了一个未提交事务的数据,即当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
    说明:事务1更新了记录,但没有提交,事务2读取了更新后的行,然后事务T1回滚,现在T2读取无效。
  • 不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同,一个事务读取到了另一个事务提交后(update)的数据。
    是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
    说明:事务1读取记录时,事务2更新了记录并提交,事务1再次读取时可以看到事务2修改后的记录;
  • 虚读(幻读):在一个事务内读取了别的事务插入的数据,导致前后读取不一致(insert)
    指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
    说明:事务1读取记录时事务2增加了记录并提交,事务1再次读取时可以看到事务2新增的记录;

2.2 不可重复读与幻读的区别

不可重复读的重点是修改:同样的条件, 你读取过的数据, 再次读取出来发现值不一样了

在一个事务中前后两次读取的结果并不一致,导致了不可重复读。
例如:在事务1中,Mary 读取了自己的工资为1000,操作并没有完成

con1 = getConnection();  
select salary from employee empId ="Mary";

在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务.

con2 = getConnection();  
update employee set salary = 2000;  
con2.commit(); 

在事务1中,Mary 再次读取自己的工资时,工资变为了2000

//con1  
select salary from employee empId ="Mary";

幻读的重点在于新增或者删除: 同样的条件, 第1次和第2次读出来的记录数不一样
例如:目前工资为1000的员工有10人。事务1,读取所有工资为1000的员工。

con2 = getConnection();  
Insert into employee(empId,salary) values("Lili",1000);  
con2.commit();

事务1再次读取所有工资为1000的员工

select * from employee where salary =1000;  

共读取到了11条记录,这就产生了幻读。

从总的结果来看,似乎不可重复读和幻读都表现为两次读取的结果不一致。
但如果你从控制的角度来看, 两者的区别就比较大。 对于前者, 只需要锁住满足条件的记录。 对于后者, 要锁住满足条件及其相近的记录。

3 事务的四个特性

事务的四个特性(ACID)

3.1 原子性

原子性(Atomicity):操作这些指令时,要么全部执行成功,要么全部不执行。只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令之前的数据状态

3.2 一致性

一致性(Consistency):事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定

3.3 隔离性

隔离性(Isolation):是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

即:要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行

3.4 持久性

持久性(Durability):当事务正确完成后,它对于数据的改变时永久性的

相关文章

  • mysql知识点总结

    mysql事务 什么是事务 事务的四大特性 事务的隔离级别 脏读,不可重复读,幻读分别是什么 隔离级别脏读不可重复...

  • mysql基础概念

    MySQL 1 数据库事务的特性(ACID) 2 脏读 幻读 不可重复读 3 事物隔离级别 4 ...

  • 面试题

    1、什么是数据库事务,事务的特性有哪些,事务ACID特性的实现原理,事务的隔离级别,什么是脏读、不可重复读、幻读呢...

  • 数据库事务隔离级别

    数据库事务隔离级别-- 脏读、幻读、不可重复读(清晰解释)

  • mysql数据mvcc版本控制原理

    事务并发执行遇到的问题 脏读(未提交读) 不可重复读(已提交读) 幻读(读出新纪录) 事务隔离级别 隔离级别脏读不...

  • Spring事务管理

    可能是最漂亮的Spring事务管理详解 数据库隔离级别 数据库隔离级别 脏读不可重复读幻读Read uncommi...

  • MySQL04

    数据库设计与事务控制 表与表之间三种关系 三大范式 ER图 事务四大特性 脏读、幻读、不可重复读、事务四种隔离级别...

  • 2018-02-07-3.spring事务管理

    事务 事务特性:acid 事务并发问题 1.脏读2.不可重复读3.幻读 事务的隔离级别 1 读未提交2 读已提交4...

  • MySQL相关(一)——— 事务和锁

    事务的隔离级别和锁机制 【1】InnoDB 事务隔离级别和锁 【2】脏读、不可重复读、幻读 mysql 相关 常用...

  • Innodb事务隔离级别和锁之间的关系

    1.事务特性: 2.事务隔离级别: 1.读未提交。 脏读,不可重复读,幻读。2.读已提交。 不可重复读。3.可重复...

网友评论

      本文标题:数据库之隔离级别,脏读幻读,事务特性

      本文链接:https://www.haomeiwen.com/subject/jhvqadtx.html