首页 > 其他分享 >03 | 事务隔离:为什么你改了我还看不见?

03 | 事务隔离:为什么你改了我还看不见?

时间:2023-06-25 21:22:09浏览次数:44  
标签:03 事务 隔离 看不见 read 回滚 视图 级别

03 | 事务隔离:为什么你改了我还看不见?

隔离性与隔离级别

当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题,为了解决这些问题,就有了“隔离级别”的概念。

SQL 标准的事务隔离级别包括:

  • 读未提交(read uncommitted):一个事务还没提交时,它做的变更就能被别的事务看到。
  • 读提交(read committed):一个事务提交之后,它做的变更才会被其他事务看到。
  • 可重复读(repeatable read):一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。
  • 串行化(serializable ):对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

在实现上,隔离级别的实现是依靠视图来实现的:

  • 读未提交隔离级别下直接返回记录上的最新值,没有视图概念;

  • 读提交隔离级别下,在每个 SQL 语句开始执行的时候创建一致性视图。

  • 可重复读隔离级别下,在事务启动时创建一致性视图,整个事务存在期间都用这个视图。(一致性视图是在第一个 Select 语句时建立的

  • 串行化隔离级别下直接用加锁的方式来避免并行访问。

查看隔离级别

show variables like 'transaction_isolation'

事务隔离的实现

以 “可重复读” 为说明。

在 MySQL 中,每条记录在更新的时候都会同时记录一条回滚操作(undo log)。记录上的最新值,都可以通过回滚,得到前一个状态的值。

img

这样,同一条记录咋系统中可以存在多个版本,这就是数据库的多版本并发控制(MVCC)。

MVCC: 多版本并发控制,通过 undo log 版本链和 read-view 实现事务隔离。

undo log 回滚日志删除时机?

在不需要时删除。即系统中,没有事务需要用到这些回滚日志时,回滚日志会被删除。

尽量不要使用长事务?

长事务会导致数据库保留很老的事务视图,这些事务相关的回滚记录都无法删除,会导致占用大量的存储空间。同时,长事务还占用所资源。

标签:03,事务,隔离,看不见,read,回滚,视图,级别
From: https://www.cnblogs.com/sun-yanglu/p/17503986.html

相关文章

  • 2023-06-25 Cannot find module 'uview-ui'
    前言:把uview2.0版本通过hx导入插件方式引入项目中,运行,遂报错:Cannotfindmodule'uview-ui'==》无法找到模块'uview-ui' 检查项目下载的包,'uview-ui'已存在,并存放于uni_modules文件夹中,引入代码为://main.js,注意要在use方法之后执行importuViewfrom"uview-ui";Vue.use(......
  • AGC033D Complexity
    Ex-BowMeowOptimization当\(n,m\)都为偶数时,记狗的正中为\(x\)吗,猫的正中为\(y\)(正中在序列中就处于两个位置之间,不与任何位置重合)一只猫\(i\)到\(x\)隔了\(C\)只狗,那么这只猫对应的代价就为\(B_i\times(\fracn2+C-(\fracn2-C))=B_i\times2C\),狗的代价同理那么对于\(x\)......
  • 开发实用小技巧(1):RuntimeError: 'cryptography' package is required for sha256_passw
    问题:RuntimeError:'cryptography'packageisrequiredforsha256_passwordorcaching_sha2_passwordauthmethods这个错误通常是由于在使用MySQL数据库时,未安装或功能不完整的“cryptography”包所引起的,所以下载“cryptography”这个包即可!!!解决思路:pipinstallcryptogr......
  • Microsoft.Data.Sqlite.SqliteException:“SQLite Error 1: 'no such column: t.Value
    使用EFcore获取SQLite的sequence时一直有此错误:Microsoft.Data.Sqlite.SqliteException:“SQLiteError1:'nosuchcolumn:t.Value'.” 以下是出错代码:varid=JVDbContext.Instance.Database.SqlQuery<int>($"SELECTseq+1FROMsqlite_sequenceWHEREname=&#......
  • ASM disk group mount fails with ORA-15036: disk is truncated [ID 1077175.1]
     ASMdiskgroupmountfailswithORA-15036:diskistruncated[ID1077175.1]--------------------------------------------------------------------------------  修改时间05-OCT-2011    类型PROBLEM    状态PUBLISHED  InthisDocument Sympto......
  • 前端封装excel下载方法&&解决前端下载请求设置responseType: 'blob'时后台报错无法处
    请求设置responseType:'blob'时接口报错了如果不做处理则获取不到接口错误信息,此时下载的文件是有问题的。/*@paramsoptions{}*data:Blob,*fileName:String,*successMsg:String,**/import{Message}from'element-ui'importdownloadExcelFilePublicHandler......
  • “800703fa 尝试对注册表项执行非法操作”错误
    “800703fa尝试对注册表项执行非法操作”错误原因管理员使用服务帐户登录到服务器进行交互式会话,然后注销后,通常会发生此问题。例如,管理员可以使用服务器场帐户登录到Web前端(WFE)服务器,然后注销。此活动强制在该帐户的配置文件中卸载注册表项。这种情况使密钥无法供将来使......
  • this.selectComponent('#test'); 打印一直是null
    this.selectComponent('#test');打印一直是null组件里面的options这个选项virtualHost:true,影响的。太坑了。。。options:{virtualHost:true,}删除就好了。网上搜到到很多种情况,但是都不是:   最后发现是: 组件里面的options这个选项virtualHost:tr......
  • TNS-03505 名称无法解析
    TNS-03505名称无法解析问题现象:[oracle@db01admin]$tnspingpriTNSPingUtilityforLinux:Version11.2.0.4.0-Productionon15-JUN-201521:57:52Copyright(c)1997,2013,Oracle.Allrightsreserved.Usedparameterfiles:TNS-03505:Failedtoresolve......
  • Access denied for user 'root'@'121.28.69.73' (using password: YES)问题的解决
    问题描述发现是连接不上远程数据库,那就只能先转成本地运行了问题解决转成本地的相关步骤:好吧,耽误了大概一个小时的时间,就是远程连接失败,需要换成本地的;就是将数据库改成本地连接就行啦!......