MySQL InnoDB 事务

事务的定义

事务:数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作; 事务是一组不可再分割的操作集合(工作逻辑单元)。

典型事务使用场景:转账


MySQL 开启事务:


MySQL 默认是开启事务的,通过 SHOW VARIABLES like ‘autocommit‘; 可以查看 MySQL 的事务开启情况。

在 autocommit = ON(自动提交事务)的情况下,可以执行 BEGIN; 或者 START TRANSACTION; 命令,改为手动提交事务,执行完 SQL 语句后,需要通过 COMMIT 命令提交事务,或者通过 ROLLBACK 命令回滚事务。
在 autocommit = OFF(手动提交事务)的情况下,执行完 SQL 语句后,需要通过 COMMIT 命令提交事务,或者通过 ROLLBACK命令回滚事务。
JDBC 编程:


测试命令:


事务 ACID 特性

原子性(Atomicity):最小的工作单元,整个工作单元要么一起提交成功,要么全部失败回滚。

一致性(Consistency):事务中操作的数据及状态改变是一致的,即写入资料的结果必须完全符合预设的规则,不会因为出现系统意外等原因导致状态的不一致。

隔离型(Isolation):一个事务所操作的数据在提交之前,对其他事务的可见性设定(一般设定为不可见)。

持久性(Durability):事务所做的修改就会永久保存,不会因为系统意外导致数据的丢失。

参考(原子性和一致性的区别是什么?)这篇博文,讲了一下原子性和一致性的区别。

事务并发带来了哪些问题

脏读

MySQL InnoDB 事务
比如 user 表中有一条用户数据,执行了如下操作:

事务B更新 id=1 的数据,age 更新为18,不提交事务
事务A查询 id=1 的数据
事务B回滚刚才的更新操作
这个时候,事务A中查询出的 id=1 的数据,age 的值是16还是18?

不可重复读


比如 user 表中有一条用户数据,执行了如下操作:

事务A查询 id=1 的数据
事务B更新 id=1 的数据,age 更新为18,并提交事务
事务A再次查询 id=1 的数据
这个时候,事务A两次查询出的 id=1 的数据,age 的值是16还是18?

幻读


比如在 user 表中执行了如下操作:

事务A查询 age>15 的数据
事务B新增一条数据,age=22,并提交事务
事务A再次查询 age>15 的数据
这个时候,事务A两次查询出的数据,数量是1条还是2条?

事务四种隔离级别

SQL92 ANSI/ISO标准:http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

Read Uncommitted(未提交读) --未解决并发问题

事务未提交对其他事务也是可见的,脏读(dirty read)

Read Committed(提交读) --解决脏读问题

一个事务开始之后,只能看到自己提交的事务所做的修改,不可重复读(non repeatable read)

Repeatable Read(可重复读) --解决不可重复读问题

在同一个事务中多次读取同样的数据结果是一样的,这种隔离级别未定义解决幻读的问题

Serializable(串行化) --解决所有问题

最高的隔离级别,通过强制事务的串行执行

InnoDB 引擎对隔离级别的支持程度


事务隔离级别的并发能力:未提交读 > 已提交读 > 可重复读 > 串行化

InnDB 引擎默认的事务隔离级别是可重复读(Repeatable Read),在该级别中它把幻读的问题也解决了。InnDB 中事务隔离级别通过锁、MVCC 实现。

通过如下语句查看 InnoDB 的默认事务隔离级别:

MySQL InnoDB 事务
MySQL InnoDB 事务
通过如下语句设置 InnoDB 的事务隔离级别:

MySQL InnoDB 事务
接下来我们来测试一下 InnoDB 的默认事务隔离级别(Repeatable Read)是否解决了脏读、不可重复读、幻读的问题。

数据准备:

MySQL InnoDB 事务
是否解决了脏读的问题?

MySQL InnoDB 事务
开启两个 MySQL 客户端,模拟事务A和事务B的操作,执行步骤如下:

事务B开启手动事务,更新 id=1 的数据,age 更新为18,不提交事务
事务A查询 id=1 的数据
事务B回滚刚才的更新操作
图中的数字是执行步骤,通过下图可以看出事务A的执行结果是16,InnDB 的默认事务隔离级别完美的解决了脏读的问题。

MySQL InnoDB 事务
是否解决了不可重复读的问题?

MySQL InnoDB 事务
开启两个 MySQL 客户端,模拟事务A和事务B的操作,执行步骤如下:

事务A开启手动事务,查询 id=1 的数据
事务B更新 id=1 的数据,age 更新为18,并提交事务
事务A再次查询 id=1 的数据
图中的数字是执行步骤,通过下图可以看出事务A两次的执行结果都是16,没有受事务B更新操作的影响,InnDB 的默认事务隔离级别完美的解决了不可重复读的问题。

MySQL InnoDB 事务
是否解决了幻读的问题?

MySQL InnoDB 事务
开启两个 MySQL 客户端,模拟事务A和事务B的操作,执行步骤如下:

事务A开启手动事务,查询 age>15 的数据
事务B新增一条数据,age=22,并提交事务
事务A再次查询 age>15 的数据
图中的数字是执行步骤,通过下图可以看出事务A两次的执行结果都是一条数据,没有受事务B新增操作的影响,InnDB 的默认事务隔离级别完美的解决了幻读的问题。

MySQL InnoDB 事务

原文地址:https://blog.51cto.com/14596725/2451366

时间: 2024-11-05 16:23:43

MySQL InnoDB 事务的相关文章

Mysql InnoDB事务

事务特点 ACIDATOMICITY:原子性 一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性 CONSISTENCY:一致性 数据库总是从一个一致性的状态转换到另一个一致性的状态. ISOLATION:隔离性 通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的. DURABILITY:持久性 一旦事务提交,则其所做的修改不会永久保存到数据库. 隔离级别:READ

一文快速搞懂MySQL InnoDB事务ACID实现原理

[51CTO.com原创稿件]说到数据库事务,想到的就是要么都做修改,要么都不做,或者是 ACID 的概念.其实事务的本质就是锁.并发和重做日志的结合体. 这一篇主要讲一下 InnoDB 中的事务到底是如何实现 ACID 的: 原子性(atomicity) 一致性(consistency) 隔离性(isolation) 持久性(durability)隔离性隔离性的实现原理就是锁,因而隔离性也可以称为并发控制.锁等.事务的隔离性要求每个读写事务的对象对其他事务的操作对象能互相分离.再者,比如操作缓

[记录][Mysql InnoDB] 事务,MVCC

InnoDB存储引擎之锁的实现 InnoDB MVCC 详解 MySQL InnoDB 的多版本并发控制(MVCC) InnoDB对MVCC的实现 原文地址:https://www.cnblogs.com/zad27/p/12111309.html

MySql - InnoDB - 事务 , Php版

1,前序 由于要重构APP(社交类) 服务端接口的部分代码,故接触到了 innoDB,以及事务这个词,下面主要是以例子的形式显示它的用法,理论的东西不过多讲述. 2,何为事务 鄙人在编程方面的解释:多条命令操作放在一起处理 , 例如提交的时候一起提交,撤销的时候也是一起撤销,书本对这个词的定义内容很多. 3,myisam 与 innoDB 它们都是 mysql数据库的引擎,我们一般建表默认的是 myisam 引擎,比较:http://www.cnblogs.com/vicenteforever/

MySQL Innodb 事务实现过程相关内容的整理

MySQL事务的实现涉及到redo和undo以及purge,redo是保证事务的原子性和持久性:undo是保证事务的一致性(一致性读和多版本并发控制):purge清理undo表空间背景知识,对于Innodb表中的行每一行包括:6字节的事务ID(DB_TRX_ID)字段: 用来标识最近一次对本行记录做修改(INSERT|UPDATE)的事务的标识符, 即最后一次修改(INSERT|UPDATE)本行记录的事务id.7字节的回滚指针(DB_ROLL_PTR)字段: 指写入回滚段(ROLLBACK s

总是忘记的场景:MySQL InnoDB四个事务级别 与 脏读、不重复读、幻读

MySQL InnoDB事务隔离级别脏读.可重复读.幻读 MySQL InnoDB事务的隔离级别有四级,默认是“可重复读”(REPEATABLE READ). ·        未提交读(READUNCOMMITTED).另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读). ·        提交读(READCOMMITTED).本事务读取到的是最新的数据(其他事务提交后的).问题是,在同一个事务里,前后两次相同的SELECT会读到不同的结果(不重复读).

MySQL InnoDB四个事务级别 与 脏读、不反复读、幻读

MySQL InnoDB事务隔离级别脏读.可反复读.幻读 希望通过本文.能够加深读者对ySQL InnoDB的四个事务隔离级别.以及脏读.不反复读.幻读的理解. MySQL InnoDB事务的隔离级别有四级,默认是"可反复读"(REPEATABLE READ). ·        未提交读(READUNCOMMITTED). 还有一个事务改动了数据,但尚未提交.而本事务中的SELECT会读到这些未被提交的数据(脏读). ·        提交读(READCOMMITTED).本事务读取

MySQL InnoDB四个事务级别 与 脏读、不重复读、幻读

MySQL InnoDB事务隔离级别脏读.可重复读.幻读 希望通过本文,可以加深读者对ySQL InnoDB的四个事务隔离级别,以及脏读.不重复读.幻读的理解. MySQL InnoDB事务的隔离级别有四级,默认是"可重复读"(REPEATABLE READ). ·        未提交读(READUNCOMMITTED).另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读). ·        提交读(READCOMMITTED).本事务读取到的

MySQL · 引擎特性 · InnoDB 事务系统

MySQL · 引擎特性 · InnoDB 事务系统 前言 关系型数据库的事务机制因其有原子性,一致性等优秀特性深受开发者喜爱,类似的思想已经被应用到很多其他系统上,例如文件系统等.本文主要介绍InnoDB事务子系统,主要包括,事务的启动,事务的提交,事务的回滚,多版本控制,垃圾清理,回滚段以及相应的参数和监控方法.代码主要基于RDS 5.6,部分特性已经开源到AliSQL.事务系统是InnoDB最核心的中控系统,涉及的代码比较多,主要集中在trx目录,read目录以及row目录中的一部分,包括