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

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

时间:2024-02-06 16:33:48浏览次数:48  
标签:事务 隔离 幻读 数据库 重复 脏读 提交 数据 读取

目录

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):当事务正确完成后,它对于数据的改变时永久性的

标签:事务,隔离,幻读,数据库,重复,脏读,提交,数据,读取
From: https://www.cnblogs.com/jingzh/p/18009939

相关文章

  • x64dbg 防止丢失数据库的插件 DbGit
    我跟了一晚上,说丢就丢了,真的无语~找到个使用git的方式备份数据库的插件DbGit 试了下,使用很简单!在手动保存或退出x64dbg时会自动执行 git add -A git commit -m命令。数据库似乎必须得在软件目录下的db目录才行,在被调试程序目录,似乎不行! 从此不会丢数据了,也算......
  • SQL数据库入门04:数据查询操作
      本文介绍基于MicrosoftSQLServer软件,实现数据库表中多种数据查询方法的具体操作。(数据库基础(四):数据查询)  系列文章中示例数据来源于《SQLServer实验指导(2005版)》一书。依据本系列文章的思想与对操作步骤、代码的详细解释,大家用自己手头的数据,可以将相关操作与分析过程......
  • java实现导出mysql数据库表信息
    java实现导出mysql数据库表信息,导出信息包含:数据库用户名,表英文名,表中文名,表业务描述,字段数量等等packagesrc.main.biz.ucenter.utils;importorg.apache.poi.ss.usermodel.Row;importorg.apache.poi.ss.usermodel.Sheet;importorg.apache.poi.ss.usermodel.Workbook;impor......
  • 重学数据库3
    多表操作(实际开发推荐,平常上课做的实验不这样做也行)多表设计1.一对多(多对一)2.多对多3.一对一一对多--外键创建表的时候createtable表名([constraint][外键名称]foreignkey(外键字段名)references主表(字段名));建完表后添加外键alter表名addconstraint......
  • 对话苏光牛:国内数据库市场已进入关键转折点,2024年或是分水岭
    “中国数据库市场已进入关键阶段,2024年或是分水岭!”“目前,国内数据库产品数量接近300款,我们真的需要这么多数据库吗?”面对这个问题,华为云数据库业务CTO苏光牛不假思索地给出了他的见解:“不仅是中国市场,全球范围内,也不需要如此多的商业数据库。”他进一步预测,随着市场的自然淘汰......
  • DataGrip 2023: 轻松管理您的数据库世界 mac/win版
    JetBrainsDataGrip2023是一款功能强大的数据库开发和管理工具,旨在帮助开发人员更轻松地管理和查询多个数据库。这个版本引入了一系列新的功能和改进,使数据库开发和管理变得更加简单和高效。→→↓↓载DataGrip2023mac+win版 首先,DataGrip2023支持更多的数据库系统和数据......
  • 【面试突击】数据库面试实战-SQL 优化(加更)
    欢迎关注公众号【11来了】,及时收到AI前沿项目工具及新技术的推送!在我后台回复「资料」可领取编程高频电子书!在我后台回复「面试」可领取硬核面试笔记!MySQL中的SQL优化这里主要说一下MySQL中如何对SQL进行优化,其实主要还是根据索引来进行优化的,如果好好了解下边的SQL......
  • Eralng 学习笔记第六天, Fun,进程,电子邮件,数据库,端口
    ErlangFun  示例:-module(helloworld). -export([start/0]). start() ->    A = fun(X) ->       io:fwrite("~p~n",[X])       end,    A(5).输出5----------------------------------------------------module(helloworld). -export(......
  • 数据库连接池
    在前面我们所讲解的mybatis中,使用了数据库连接池技术,避免频繁的创建连接、销毁连接而带来的资源浪费。下面我们就具体的了解下数据库连接池。3.1介绍没有使用数据库连接池:客户端执行SQL语句:要先创建一个新的连接对象,然后执行SQL语句,SQL语句执行后又需要关闭连接对象从而释......
  • python时实检测数据库表的数据变化
     在实际的数据处理和监控应用中,有时我们需要实时监测数据库表的数据变化,以便及时发现和处理数据更新、插入或删除操作。本文将介绍如何使用Python和数据库连接库来实现对数据库表的实时监测,帮助读者了解如何利用Python编写监控程序,实时捕获数据库表的数据变化。 第一步:连接数据......