首页 > 数据库 >数据库隔离级别

数据库隔离级别

时间:2024-05-03 14:33:20浏览次数:10  
标签:事务 隔离 Read 数据库 脏读 级别 singo

1.概述

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable ,这四个级别可以逐个解决脏读 、不可重复读 、幻读 这几类问题。

脏读 不可重复读 幻读
Read uncommitted
Read committed ×
Repeatable read × ×
Serializable × × ×

注意:我们讨论隔离级别的场景,主要是在多个事务并发 的情况下,因此,接下来的讲解都围绕事务并发。

2.Read uncommitted 读未提交

公司发工资了,领导把5000元打到singo的账号上,但是该事务并未提交,而singo正好去查看账户,发现工资已经到账,是5000元整,非常高 兴。可是不幸的是,领导发现发给singo的工资金额不对,是2000元,于是迅速回滚了事务,修改金额后,将事务提交,最后singo实际的工资只有 2000元,singo空欢喜一场。

出现上述情况,即我们所说的脏读 ,两个并发的事务,“事务A:领导给singo发工资”、“事务B:singo查询工资账户”,事务B读取了事务A尚未提交的数据。

当隔离级别设置为Read uncommitted 时,就可能出现脏读,如何避免脏读,请看下一个隔离级别。

3.Read committed 读提交

singo拿着工资卡去消费,系统读取到卡里确实有2000元,而此时她的老婆也正好在网上转账,把singo工资卡的2000元转到另一账户,并在 singo之前提交了事务,当singo扣款时,系统检查到singo的工资卡已经没有钱,扣款失败,singo十分纳闷,明明卡里有钱,为 何......

出现上述情况,即我们所说的不可重复读 ,两个并发的事务,“事务A:singo消费”、“事务B:singo的老婆网上转账”,事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。

当隔离级别设置为Read committed 时,避免了脏读,但是可能会造成不可重复读。

大多数数据库的默认级别就是Read committed,比如Sql Server , Oracle。如何解决不可重复读这一问题,请看下一个隔离级别。

4.Repeatable read 重复读

当隔离级别设置为Repeatable read 时,可以避免不可重复读。当singo拿着工资卡去消费时,一旦系统开始读取工资卡信息(即事务开始),singo的老婆就不可能对该记录进行修改,也就是singo的老婆不能在此时转账。

虽然Repeatable read避免了不可重复读,但还有可能出现幻读 。

singo的老婆工作在银行部门,她时常通过银行内部系统查看singo的信用卡消费记录。有一天,她正在查询到singo当月信用卡的总消费金额 (select sum(amount) from transaction where month = 本月)为80元,而singo此时正好在外面胡吃海塞后在收银台买单,消费1000元,即新增了一条1000元的消费记录(insert transaction ... ),并提交了事务,随后singo的老婆将singo当月信用卡消费的明细打印到A4纸上,却发现消费总额为1080元,singo的老婆很诧异,以为出 现了幻觉,幻读就这样产生了。

注:Mysql的默认隔离级别就是Repeatable read。

5.Serializable 序列化

Serializable 是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻像读。

本文为转载,原文为:数据库事务隔离级别

标签:事务,隔离,Read,数据库,脏读,级别,singo
From: https://www.cnblogs.com/monkey6/p/18171193

相关文章

  • Oracle23ai 数据库的简单验证
    Oracle23ai数据库的简单验证背景2024年5.1期间发现有公众号再说Oracle23c使用容器方式进行安装的感觉可以试用把玩一下.简单安装dockerpullcontainer-registry.oracle.com/database/free:latest运行timedockerrun-d--nameoracle23ai-horacle23ai\--net......
  • mysql 隔离级别为可重复读如何解决幻读
    MySQL中的可重复读(RepeatableRead,RR)隔离级别通过几种机制来解决幻读问题:1.**多版本并发控制(MVCC)**:在可重复读隔离级别下,MySQL使用MVCC来管理事务读取的数据版本。这意味着在事务开始时,系统会创建一个ReadView(读视图),该视图记录了当前所有活跃事务的ID。当执行SELECT查询时......
  • db.create_all() 报错上下文?flask_sqlalchemy创建数据库找不到上下文?
    问题报错:RuntimeError:Workingoutsideofapplicationcontext.Thistypicallymeansthatyouattemptedtousefunctionalitythatneededthecurrentapplication.Tosolvethis,setupanapplicationcontextwithapp.app_context().Seethedocumentationform......
  • 【VMware vCenter】连接和使用vCenter Server嵌入式vPostgres数据库。
    vCenterServer早期支持内嵌(embedded)和外部(external)数据库,内嵌数据库就是vPostgres,基于VMwarePostgres数据库(PostgreSQL数据库),外部数据库用的多的是Oracle数据库和SQLServer数据库。因为早期使用内嵌的PostgreSQL数据库只能用于小型环境,比如仅支持几十台主机以及几百个虚拟机,所......
  • klog在日志文件中error级别日志重复打印2次
    问题现象packagemainimport( "flag" "gopkg.in/natefinch/lumberjack.v2" "k8s.io/klog/v2")funcmain(){ klog.InitFlags(nil) flag.Set("logtostderr","false") flag.Parse() l:=&lumberjack.Logger......
  • 在 .net core 3.1 的 docker 镜像生成的容器中,连接 sql server 2008 r2 版本的数据库,
    错误1:{"ClassName":"System.Data.SqlClient.SqlException","Message":"Aconnectionwassuccessfullyestablishedwiththeserver,butthenanerroroccurredduringthepre-loginhandshake.(provider:TCPProvider,......
  • Prometheus监控MongoDB数据库
    监控环境:Prometheus数据库:MongoDB3.4.6集群,3个节点监控工具:mongodb_exporter 1、创建Mongodb监控可读账号 mongodbadmin库中执行useadmindb.createUser({user:"prometheus",pwd:"prometheus",roles:[{role:"read",db:&qu......
  • simpread-课程 24:工作单元之数据库事务【AOP】
    一、工作单元事务代码分析在上一个课程,我们已经实现了数据库事务功能,来保证数据的完整性。通过上一个课程的实现方式,我们在每一个Action开头和结尾,都需要添加对应的代码,才能实现事务功能,具体见以下截图:这种实现方式存在以下2个问题:在具体业务开发中,一个请求往往都会涉......
  • JDBC与各数据库产品连接的驱动及URL示例
    数据库驱动类JDBC连接Oracleoracle.jdbc.driver.OracleDriverjdbc:oracle:thin:@//127.0.0.1:1521/SchemaNameSQLServercom.microsoft.sqlserver.jdbc.SQLServerDrivernet.sourceforge.jtds.jdbc.Driverjdbc:sqlserver://127.0.0.1:1433;databa......
  • openGauss 创建和管理数据库
    创建和管理数据库前提条件用户必须拥有数据库创建的权限或者是数据库的系统管理员权限才能创建数据库,赋予创建数据库的权限参见管理用户及权限。背景信息初始时,openGauss包含两个模板数据库template0、template1,以及一个默认的用户数据库postgres。postgres默认的兼容数据库......