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

事物隔离级别

时间:2024-02-27 13:46:52浏览次数:17  
标签:事务 读取 幻读 事物 重复 级别 隔离

> 事物隔离级别

MySQL中的事务隔离级别一共有4种:

1. 读未提交(Read Uncommitted)  

  最低隔离级别,事务可以读取到别的事务尚未提交的修改。可能会导致脏读、不可重复读和幻读。

2. 读已提交(Read Committed)

  解决脏读,保证读取到的数据均已提交。可能导致不可重复读和幻读。

3. 可重复读(Repeatable Read)

  解决脏读和不可重复读,保证多次读取的数据一致。可能导致幻读。是MySQL的默认隔离级别。  

4. 串行化(Serializable) 

   最高隔离级别,事物依次执行,避免上述所有问题,但性能较低。 

MySQL服务器对4个事务隔离级别的实现都不完全满足严格意义上的事务原则,都是在一定程度上“松散”的实现。

开发中需要根据业务场景选择合适的隔离级别,在性能和一致性中权衡。

 

不可重复读(Non-Repeatable Read)是数据库事务的一个问题,它发生在以下情况:

1. 一个事务在同一查询中,第一次读取某条记录。

2. 与此同时,另一个事务对该记录进行了更新。

3. 然后第一个事务再次读取同一记录,发现值已被修改。

比如事务1读取了库存值为10的产品记录,这时事务2更新了该产品记录,将库存改为了8。然后事务1再次读取同一产品时,库存值变成了8,导致两个查询返回了不同结果。

这就是不可重复读。它会导致一个事务中同样的查询,返回了不同数据。

原因在于两个事务隔离性不够,正在操作同一记录而相互干扰。这会影响一致性。

在MySQL中,默认的REPEATABLE READ隔离级别可以避免这种情况,它会通过行锁保证同一事务中多次读取数据一致。

 

幻读(Phantom Read) 是数据库事务隔离级别的一个问题,它发生在以下情况:

1. 一个事务(T1)读取了某范围的数据集后。

2. 另一个并发事务(T2)在第一个事务结束之前插入了新的数据到该数据集范围中。

3. 当第一个事务(T1)再次读取同一数据集范围的时候,发现多了新插入的数据,就好像发生了幻觉一样。

比如T1根据条件查询库存表,读到结果有10行记录。这时T2插入了一条匹配查询条件的新记录。当T1再次查询时,结果就变成了11行,好像“新生”了一条数据,这就是幻读。

幻读与不可重复读不同的地方在于,不可重复读是更新改变了某一行,而幻读是有新的行“凭空”增加了。

在MySQL中,幻读现象是可能发生的,需要应用使用加锁来避免。提升隔离级别为可串行化(Serializable)也可以解决这个问题。

 

可重复读(Repeatable Read)是数据库事务的一个隔离级别。 

它的意思是在同一个事务中,多次读取同一个数据总是返回相同结果,即之前读取过的数据在事务结束前不能被其他事务修改,具有可重复读的特征。

在这种隔离级别下,可以避免以下情况:

1. 脏读:一个事务读取到另一个事务还未提交的变更。 

2. 不可重复读:一个事务中多次读取的数据结果不一致。

但仍然可能出现幻读的问题,即一个事务提交之前,其他事务插入了新的数据。

在MySQL中,默认采用的隔离级别就是REPEATABLE READ,即可重复读。它通过行锁机制防止同一行数据被其他事务修改,从而保证了在当前事务中可以重复读取到相同结果。 

这为应用提供了良好的一致性,但有可能因为行锁造成并发性能损耗。

标签:事务,读取,幻读,事物,重复,级别,隔离
From: https://www.cnblogs.com/irobotzz/p/18036710

相关文章

  • vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助一、是什么权限是对特定资源的访问许可,所谓权限控制,也就是确保用户只能访问到被分配的资源而前端权限归根结底是请求的发起权,请求的发起可能有下面两种形式触发页面加载触发页面上的按钮点击触发总的来说,所有......
  • 记录级别索引:Hudi 针对大型数据集的超快索引
    介绍索引是一个关键组件,有助于Hudi写入端快速更新和删除,并且它在提高查询执行方面也发挥着关键作用。Hudi提供了多种索引类型,包括全局变化的Bloom索引和Simple索引、利用HBase服务的HBase索引、基于哈希的Bucket索引以及通过元数据表实现的多模态索引。索引的选择取决于表大......
  • mysql 8.0版本 秒级别加列
    假设有一个名为test_table的MySQL8.0表,目前没有任何数据,我们想要在某一列之后添加一列created_at,类型为TIMESTAMP,并设定为记录每行插入时的秒级别时间戳,使用ALGORITHM=INSTANT进行在线添加列的操作。以下是测试案例: --首先,创建一个测试表CREATETABLE`test_table1`(......
  • 03 事务隔离
    03事务隔离事务:保证一组数据库操作,要么全部成功,要么全部失败。在MySQL中,事务支持是在引擎层实现的。事务ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性)。建议你尽量不要使用长事务。****读未提交(readuncommitted)、读提交(readco......
  • 城市级别系统容灾建设方案演进(同城灾备、同城双活、两地三中心、异地双活、异地多活)
     本文为文章《两地三中心数据中心和同城双活数据中心的区别?》的阅后简单备忘总结。虽实际中可能不会从事与该话题直接相关的技术工作,但其背后的的技术原理是相同的。     ———————————————————————————— ......
  • 物理隔离环境下 如何实现数据安全导入导出?
    数据安全导入导出是指在确保数据安全的前提下,将文件从一个系统或网络环境传输到另一个系统或网络环境的过程。一般情况下,都是物理隔离的环境,而且是单向的数据导入导出。我们以数据导出为例,要实现这种物理隔离环境下的数据安全导出,比较传统的方式就是用户将文件上传到指定服务器,......
  • 深度学习的始祖框架,grandfather级别的框架 —— Theano —— 示例代码学习(5)
    代码1:(求雅可比矩阵,jacobian矩阵求解)importtheanofromtheanoimporttensor#Creatingavectorx=tensor.dvector('x')#Creating'y'expressiony=(2*x**3)#ComputingderivativeOutput,updates=theano.scan(lambdai,y,x:tensor.g......
  • 深度学习的始祖框架,grandfather级别的框架 —— Theano —— 示例代码学习(4)
    实战(DenseLayer):下面用本篇的内容,写一个全连接层,实现前向传播、反向传播和参数更新。并用它实现一个3输入1输出的单层感知机,拟合函数y=x0+x1+x2。代码:importtheanoimporttheano.tensorasTTimportnumpyasnpimportpylabclassDataset():def__init__(......
  • 深度学习的始祖框架,grandfather级别的框架 —— Theano —— 示例代码学习(3)
    实战:写一个卷积层ConvolutionLayer二维卷积的前向操作:代码:importtheano.tensorasTTimporttheanoimportnumpyasnp#fromtheano.tensor.shared_randomstreamsimportRandomStreamsIdentity=lambdax:xReLU=lambdax:TT.maximum(x,0.0)Sigmoid=lambda......
  • 深度学习的始祖框架,grandfather级别的框架 —— Theano —— 示例代码学习(2)
    代码1:(ifelse判断结构)importtheanofromtheanoimporttensorfromtheano.ifelseimportifelsex=tensor.fscalar('x')y=tensor.fscalar('y')z=ifelse(x>0,2*y,3*y)#x>0的返回值是int8类型f=theano.function([x,y],z,allow_input_down......