首页 > 其他分享 >事务的隔离级别

事务的隔离级别

时间:2023-11-29 14:55:48浏览次数:47  
标签:事务 隔离 幻读 级别 脏读 数据 id

事务的常见问题:脏读,幻读,不可重复读

更新丢失(Lost Update)
	原因:当多个事务选择同一行操作,并且都是基于最初选定的值,由于每个事务都不知道其他事务的存在,就会发生更新覆盖的问题。类比github提交冲突。

脏读(Dirty Reads)
	原因:事务A读取了事务B已经修改但尚未提交的数据。若事务B回滚数据,事务A的数据存在不一致性的问题。

不可重复读(Non-Repeatable Reads)
	原因:事务A第一次读取最初数据,第二次读取事务B已经提交的修改或删除数据。导致两次读取数据不一致。不符合事务的隔离性。

幻读(Phantom Reads)
	原因:事务A根据相同条件第二次查询,虽然查询不到事务B提交的新增数据,但是会影响事务A之后的一些操作,比如:事务A进行了一次select * from t1表查询,查询出id为1的数据,同时事务B进行了一次insert into t1 values(2,'xx'),也就是此时表中有了id为2的数据,但是在事务A中再次进行查询的时候,根本就查不到id为2的数据,但是当事务A进行insert into t1 values(2,'xx'),也想插入id为2的数据的时候,发现报错了,看图,但是事务A怎么查也查不到有id为2的数据,这就让事务A的使用者出现了幻觉,what happend!。如果不想出现幻读问题,那么自己在查询语句中手动加锁 for update,如果查询的是id为2的数据,即便是现在没有id为2的数据,其他事务也无法对id为2的索引位置进行数据的处理。
	

幻读和脏读有点类似
    脏读是事务B里面修改了数据,
    幻读是事务B里面新增了数据。

事务的隔离级别:未提交读\已提交读\可重复读\可序列化(串行化)

+------------------------------+---------------------+--------------+--------------+-----
| 隔离级别                      | 读数据一致性         | 脏读         | 不可重复 读   | 幻读   
+------------------------------+---------------------+--------------+--------------+-----
| 未提交读(Read uncommitted)    | 最低级别            | 是           | 是           | 是     
+------------------------------+---------------------+--------------+--------------+-----
| 已提交读(Read committed)      | 语句级              | 否           | 是           | 是     
+------------------------------+---------------------+--------------+--------------+-----
| 可重复读(Repeatable read)     | 事务级              | 否           | 否           | 是     
+------------------------------+---------------------+--------------+--------------+-----
| 可序列化(Serializable)        | 最高级别,事务级      | 否           | 否           | 否     
+------------------------------+---------------------+--------------+--------------+-----



查看当前数据库的事务隔离级别:show variables like 'tx_isolation';

事务的隔离级别设置

1.未提交读(READ UNCOMMITED) 解决的障碍:无; 引入的问题:脏读
    set SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

2.已提交读 (READ COMMITED) 解决的障碍:脏读; 引入的问题:不可重复读
    set SESSION TRANSACTION ISOLATION LEVEL read committed;

3.可重复读(REPEATABLE READ)解决的障碍:不可重复读; 引入的问题:幻读
    set SESSION TRANSACTION ISOLATION LEVEL repeatable read;

4.可串行化(SERIALIZABLE)解决的障碍:可重复读; 引入的问题:锁全表,性能低下
    set SESSION TRANSACTION ISOLATION LEVEL repeatable read;

总结:

事务隔离级别为可重复读时,如果有索引(包括主键索引)的时候,以索引列为条件更新数据,会存在间隙锁间、行锁、页锁的问题,从而锁住一些行;如果没有索引,更新数据时会锁住整张表

事务隔离级别为串行化时,读写数据都会锁住整张表

隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大,对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免脏读取,而且具有较好的并发性能。

标签:事务,隔离,幻读,级别,脏读,数据,id
From: https://www.cnblogs.com/piggthird/p/17864837.html

相关文章

  • E9代码使用事务
     注意代码里有两行update语句第一行是文本值,可以修改。第二行fpsl 是数字,改为文本的话会报错。提交事务,最终效果两行都没有改变。证明事务回滚成功。packagecom.test;importcom.engine.sunnypol.util.SapRfc;importorg.apache.http.client.config.RequestConfi......
  • 配置Oracle链接服务器使用分布式事务​
    1现象在SQLServer中创建指向Oracle的链接服务器,SQL语句在事务中向链接服务器插入数据。返回链接服务器无法启动分布式事务的报错。2解决在Windows平台下,SQLServer依赖分布式事务协调器(MSDTC)来使用分布式事务,OracleClient使用OracleServicesforMicrosoftTransactionServer......
  • spring事务学习
    1,spring方法内部调用亲自测试:同一个类中一个方法(无事务)调用另一个方法(有事务),事务不生效问题同一个类中一个方法(有事务)调用另一个方法(有事务),事务会生效   ......
  • 事务的一致性是什么?
    熵增定律什么是熵增定律?熵的物理意义是分子无序化的量度,换句话说,熵是对体系混乱程度的一种度量。而熵增,即是在一个孤立系统中,事物总是自发、不可逆的朝着熵增加(混乱)方向进行。当熵达到最大值时,系统就会出现严重混乱,最终走向灭亡。可以说,熵增定律是人类至今为止所发现的最令人......
  • Java中的事务——JDBC事务和JTA事务
    简介: 本文来介绍一下J2EE中和事务相关的内容,在阅读本文之前,希望读者对分布式有一定的了解。Java事务的类型有三种:JDBC事务、JTA(JavaTransactionAPI)事务、容器事务。本文来介绍一下J2EE中和事务相关的内容,在阅读本文之前,希望读者对分布式有一定的了解。Java事务的类型有三种:JDB......
  • MySQL_事务
    事务的特性ACIDA原子性:一个事务中的所有操作,要么全部完成,要么全部不完成。undolog保证C一致性:事务操作前和操作后,数据满足完整性约束,数据库保持一致性状态。原子性、隔离性、持久性保证I隔离性:多个并发事务交叉执行,使用相同的数据时,互不干扰,每个事务都有一个完整的数据空间......
  • 在 Go-Kratos 框架中优雅的使用 GORM 完成事务
    准备工作创建新项目kratosnewhelloworldcdhelloworld#拉取项目依赖gomoddownload#项目中的config等请自行修改 添加事务如果您还不了解Kratos、mysql事务和GORM的话请先了解一下。data层承载事务是否比较合适?其实最简单也最直接的方法就是在da......
  • General error: 1205 Lock wait timeout exceeded; try restarting transaction【事务
    转载:https://blog.51cto.com/u_12390904/6254246       ......
  • C# 接口隔离,反射 2023年11月20日
    1.1接口隔离接口的隔离,对''胖'接口进行拆分单一职责原则接口的显示接口实现(c#独有的语言特性)dependencyInjection,依赖注入框架包适当使用接口泛型,partial类,枚举,结构泛型:泛化数据类型泛型的特化:指定类型泛型委托和lambda表达式partial类$符号的......
  • Spring_2023_11_24_2 Spring整合mybatis--Spring中的事务管理(注解形式)
    Spring整合mybatis--Spring中的事务管理(注解形式)application.xml<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:tx="http://www.springframework.org/schema/tx&quo......