首页 > 数据库 >[转帖]Mysql数据库的事务特性、隔离级别及MVCC多版本并发控制简介

[转帖]Mysql数据库的事务特性、隔离级别及MVCC多版本并发控制简介

时间:2024-05-09 21:45:31浏览次数:26  
标签:事务 数据库 MVCC 查询 转帖 Mysql ID 数据 id

https://my.oschina.net/tongchengyu/blog/4714950

事务的特性

数据库如果支持事务,就要满足下面四个特性(ACID)。

原子性(A:Atomicity)

在一个事务中,多个sql操作,要么一起成功(所有数据操作都成功),要么一起回滚(其中一个没有成功,其他数据操作一起恢复到开始状态)。

一致性(C:Consistency)

数据修改前是准确的,修改后也要说准确的。指的是数据从一个一致性状态,转换到另一种一致性的状态。(例如:A和B总共有10个苹果,A转让了几个苹果给B,事务结束后,A和B总共还是10个苹果)。

隔离性(I:Isolation)

当数据库有多个事务一起执行时,各个事务之间互相不影响,每个事务感知不到有其他的事务在执行。

持久性(D:Durability)

数据库事务结束提交后,数据修改永久有效,即使数据库重启,遇到其他问题关掉,再打开后,之前提交过的数据的修改还是生效的(例如:程序执行数据的操作,事务提交后,突然数据库服务器断电等原因导致数据库停掉不可用,恢复后,数据还是修改后的状态)。

事务隔离级别

读未提交

两个事务同时操作数据库,其中一个事物修改数据库后,没有提交,另一个事物可以读取到修改过的数据。

读已提交

有两个事务,第一个事务查询一条数据,第二个事务修改这条数据提交后,第一个事务又查询该数据,第一个事务前后两次查询的结果不一致。

可重复读(mysql默认隔离级别,通过MVCC<Mutil-Version Concurrency Control>机制实现)

有两个事务,第一个事务查询一条数据,第二个事务修改这条数据提交后(出于性能考虑,使用了以乐观锁为理论基础的MVCC<多版本并发控制>来实现),第一个事务又查询该数据,第一个事务前后两次查询的结果不致。

串行化(解决 幻读 的问题)

可重复读可以限制两个事务并发修改删除数据导致前后查询不一致的情况,但是无法限制insert(行锁只能锁住行,新增数据无法限制)。

幻读的案例场景:有两个事务,第一个数据查询列表数据条数,第二个事务新增数据到表中并提交事务,第一个事务又重新查询数据条数,第一个事务前后两次查询的数据不一致。

串行化:有两个事务,第一个事务查询数据,第二个事务新增数据到表中,会报错(表级锁),不能插入数据,第一个事务再查询数据,前后两次结果一致。串行化并发低。

MVCC原理简介:

通过事务id控制不同版本数据(因为通过事务id控制数据,所以下面数据中id也是会重复的),sql查询的时候,后两列隐藏列不会显示。下列表格对应的事务开始顺序与数字大小顺序一致,最终所有事务一起结束。(通过并发情况简单说明MVCC原理)

事务id=1插入数据;事务id=3插入数据;事务id=4删除数据;事务id=5修改数据;表最终数据如下:

id 数据 更新事务ID(隐藏列) 删除事务ID(隐藏列)
1 张三 1 4
2 小明 1
3 李四 1
4 王五 3
2 小明111 5

事务id=2,查询全表数据,查询数据如下:

start transaction; 

select * from a; //(1) 

select * from a; //(2) 

commit; 

假设:

事务id=2中(1)查询发生在事务id=1之后 ;

事务id=2中(2)查询发生在事务id=3插入数据之后;

事务id=2两次查询结果都一样(通过事务id做了限制,只会查询小于等于当前事务id的数据)

id 数据 更新事务ID(隐藏列) 删除事务ID(隐藏列)
1 张三 1
2 小明 1
3 李四 1

假设:

事务id=2中(1)查询发生在事务id=1之后 ;

事务id=2中(2)查询发生在事务id=4删除数据之后;

事务id=2两次查询结果都一样(通过事务id做了限制,只会查询小于等于当前事务id的数据)

id 数据 更新事务ID(隐藏列) 删除事务ID(隐藏列)
1 张三 1 4
2 小明 1
3 李四 1

假设:

事务id=2中(1)查询发生在事务id=1之后 ;

事务id=2中(2)查询发生在事务id=5修改数据之后(修改也相当于插入一条数据,数据的事务id是不同的);

事务id=2两次查询结果都一样(通过事务id做了限制,只会查询小于等于当前事务id的数据)

id 数据 更新事务ID(隐藏列) 删除事务ID(隐藏列)
1 张三 1
2 小明 1
3 李四 1

标签:事务,数据库,MVCC,查询,转帖,Mysql,ID,数据,id
From: https://www.cnblogs.com/jinanxiaolaohu/p/15768241.html

相关文章

  • mysql面试
    001Mysql如何实现索引机制MySQL中索引分三类:B+树索引,Hash索引,全文索引InnoDB索引和MySAM索引实现的区别是什么?MySAMMySAM索引文件和数据是分离的,使用B+树实现,主键索引和辅助索引实现一致,索引文件仅保存记录所以在页的指针(物理地址),通过这些地址来读取页,进而读取被索引的行 ......
  • MySQL 创建数据库使用 UTF-8 问题
    问题描述将emoji符号(如......
  • mysql - mysql 命令行的使用
    1.Mysql管理连接数据库--连接本地数据库mysql-uroot-p--连接远程数据库mysql-h192.168.0.105-uroot-p--连接远程指定数据库并设置字符集mysql-h192.168.0.105-uroot-p--default-character-set=utf8test修改root密码,直接修改配置文件[mysql]......
  • 【转】[MySQL] 忘记密码的处理之 Windows 篇
    来自:阿里的通义灵码在Windows环境下,如果你忘记了MySQL的root密码,可以通过以下步骤重置:停止MySQL服务:打开“服务”管理工具(可以通过运行 services.msc 或搜索“服务”找到)。找到名为 MySQL 或 MySQL80(根据你的版本)的服务,然后右键选择“停止”。找到MySQ......
  • 【转】[MySQL] 忘记密码的处理之 Linux 篇
    来自:阿里的通义灵码如果你忘记了MySQL的root用户密码,可以按照以下步骤重置:方法1:使用 mysqld_safe 跳过授权表停止MySQL服务:bash sudoservicemysqlstop启动MySQL并跳过授权表:bash sudomysqld_safe--skip-grant-tables&登录到MyS......
  • mysql8.0数据库添加用户和授权
    MySql8有新的安全要求,不能像之前的版本那样一次性创建用户并授权需要先创建用户,再进行授权操作1.创建新用户createuser'username'@'host'identifiedby'password';其中username为自定义的用户名;host为登录域名,host为'%'时表示为任意IP,为localhost时表示本机,或者填写指......
  • Python 如何优雅的操作 PyMySQL
    一、PyMysql在使用Python操作MySQL数据过的过程中,基本的增删改查操作如何更加高效优雅的执行。这里将以PyMySQL为例,介绍一下如何使用Python操作数据库。Python对MySQL数据库进行操作,基本思路是先连接数据库Connection对象,建立游标Cursor对象,然后执行SQL语句对数据库进行操作......
  • mysql多表查询
    1.多表查询  项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:一对多(多对一)多对多一对一2.分类连接查询内连接:相当于查询A、B交集部分数据外......
  • Mysql替换字段中指定字符(replace 函数)
    一、简介函数将字符串中出现的所有子字符串替换为新的子字符串。REPLACE()函数是基于字符的替换,并且替换字符串时是区分大小写的。二、语法这里是MySQLREPLACE()函数的语法:REPLACE(str,from_str,to_str)参数str必需的。原字符串。from_str必需的。被替换的子字符......
  • mysql~数据完整性考虑~外键约束
    在MySQL中,当为表添加外键约束时,可以指定在删除或更新父表记录时的行为。下面进行总结:CASCADE:当父表中的记录被删除或更新时,自动删除或更新子表中相关联的记录。这意味着如果父表中的记录被删除,那么相应的子表中与之关联的记录也会被删除。SETNULL:当父表中的记录被删除或更......