【Mysql 数据库的隔离级别】

本文详细介绍了数据库中的事务概念及其四大特性,并深入探讨了四种不同的事务隔离级别:读未提交、已提交读、可重复读及串行读。针对每种隔离级别,分析了其在并发场景下可能产生的问题及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库的隔离级别

1.事务

事务只是一个改变,是一些操作的集合;用专业的术语来讲,他就是一个执行单元;事务本身不包含这4个特性,我们需要通过某些手段,尽可能的让这个执行单元满足这个4个特性,那么我们就可能称之他为事务,或者说是一个正确的事务。

2.四特性

  • 原子性 :满足原子操作单元,对数据的操作,要么全部执行,要么全部失败
  • 一致性 :事务开始和完成,数据必须保持一致
  • 隔离性 :事务之间都是相互独立的,中间状态对外不可见
  • 持久性 :数据的修改是永久性的

3.隔离级别

3.1并发情况下事务引发的问题

一般情况下,多个单元操作并发执行,会出现以下问题

  • 脏读:A事务还未提交,B事务就读到来A事务的结果(破坏隔离级别)
  • 不可重复读:A事务在本次事务中,对自己未操作过的数据,进行了多次读取,结果出现了不一致或者记录不存在的情况。(破坏一致性,update和delete)
  • 幻读:A事务在本次事务中,对自己未操作过的数据,进行多次读取,第一次读取时,记录不存在,第二次读取时,记录存在了。(破坏一致性, insert)

3.2 解决(指定标准)

为了权衡 【隔离】和【并发】的矛盾,ISO定义来四个事务的隔离级别,每个级别隔离程度不同,允许出现的副作用也不一样。

  • 读未提交(read-uncommitted):最低级别,只能保证持久性 (感觉好像没啥用吧)
  • 已提交读(read-committed) :语句级别的
  • 可重复读(repeateable-read) :事务级别的
  • 串行读(seriallzable):最高级别,事务与事务完全串化执行,毫无并发可言,性能极低
    在这里插入图片描述

3.3 实现[innodb]

  • 锁机制 :组织其他事务对数据进行操作,各个隔离级别主要体现在读取数据时加的锁和释放时机
    • 读未提交(read-uncommitted) RU:事务读取的时候不加锁
    • 已提交读(read-committed) RC:事务读取的时候加行级共享锁(读到才加锁),一但读完,立刻释放锁(并不是等待事务结束才释放)
    • 可重复读(repeateable-read) RR:事务读取时加行级锁,直到事务结束才会释放
    • 串行读(seriallzable) SZ:事务读取时加表级共享锁,知道事务结束时,才会释放
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值