MySQL存储引擎与事务

2022-11-17,,

1.作用

和磁盘的数据打交道

2.简介

MySQL  基于存储引擎管理 表空间数据数据文件

3.种类

Innodb存储引擎
ibd:存储表的数据行和索引
frm:表基本结构信息
Myisam存储引擎
frm
myi
myd

4.Innodb存储引擎核心特性

4.1事务的基本特性ACID特性:

1.原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。

2.一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。

3. 隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。

4.持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。

4.2并发事务带来的问题

1.更新丢失

假设table中的price在更新前为0

如A用户开始一个事务:

BEGIN;

SELECT price FROM table WHERE id=1;

#开始更新

UPDATE table SET  price = price + 1  WHERE id=1;

COMMIT;

B用户在A用户未提交事务时,同样更新:

BEGIN;

SELECT price FROM table WHERE id=1; #此处的price应该是1,但是A用户未提交事务,所以还是0

#开始更新

UPDATE table SET  price = price+2  WHERE id=1;

COMMIT;

最终price=2,但实际上应该是3,这就是更新丢失

2.脏读

一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做"脏读".上面B用户在读取price时,A用户未提交事务,B用户读到就是脏数据.

3.不可重复读

一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除了!这种现象就叫做“不可重复读”。

4.幻读

一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读”。

4.3事务的实现

事务的实现

隔离性通过Mysql InnoDB锁就可以实现,

原子性、一致性、持久性通过数据库的redo和undo来完成

4.4隐式提交的SQL语句

以下这些SQL语句会产生一个隐式的提交操作,即执行完这些语句后,会有一个隐式的COMMIT操作。

1、DDL语句:ALTER DATABASE...UPGRADE DATA DIRECTORY NAME、。。。。

2、用来隐式的修改mysql架构的操作:CREATE USER、DROP USER、GRANT、RENAME USER、REVOKE、SET PASSWORD。

3、管理语句:ANALYZE TABLE、CACHE INDEX、CHECK TABLE、LOAD INDEX INTO CACHE、OPTIMIZE TABLE 、REPAIR TABLE。

4.5对于事务操作的统计

QPS:question per second,每秒请求数

TPS:transaction per second,每秒事务处理的能力

计算TPS的方法是(com_commit+com_rollback)/time,用这种方法的前提是,所有的事务必须都是显式提交的。

4.6事务的隔离级别

mysql的四种隔离级别

查看当前会话的事务隔离级别

查看全局事务隔离级别

在SERIALIZBLE的事务隔离级别,InnoDB存储引擎会对每个SELECT语句后自动加上LOCK IN SHARE MODE,即给每个读取操作加一个共享锁,因此在这个事务隔离级别下,读占用锁了,一致性的非锁定读不再予以支持,一般不再本地事务中使用SERIALIZBLE的隔离级别,SERIALIZABLE的事务隔离级别主要用于InnoDB存储引擎的分布式事务。

在READ COMMITED的事务隔离级别下,除了唯一性的约束检查以及外键约束的检查需要Gap Lock,InnoDB存储引擎不会使用Gap Lock的锁算法。

分布式事务

通过XA事务可以来支持分布式事务的实现,在使用分布式事务时,InnoDB存储引擎必须使用SERIALIZABLE的隔离级别,查看是否启用了XA事务支持(默认开启)

在默认配置下,mysql数据库总是自动提交的。

MySQL存储引擎与事务的相关教程结束。

《MySQL存储引擎与事务.doc》

下载本文的Word格式文档,以方便收藏与打印。