mysql小计

本文详细介绍了MySQL中的事务特性,包括原子性、一致性、隔离性和持久性,并讨论了并发问题及其解决方案,如脏读、不可重复读和幻读。SQL92标准的四种事务隔离级别被提出以应对并发问题。此外,还解析了InnoDB、MyISAM、MEMORY和ARCHIVE四种存储引擎的特点,重点阐述了InnoDB的事务安全和支持行级锁定的优势。
摘要由CSDN通过智能技术生成

前言

1事务

在 MySQL 中,事务支持是在引擎层实现的。

简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。你现在知道,MySQL 是一个支持多引擎的系统,但并不是所有的引擎都支持事务。比如 MySQL 原生的 MyISAM 引擎就不支持事务,这也是 MyISAM 被 InnoDB 取代的重要原因之一

1.1事务特性及并发会出现什么问题

1、原子性(Atomicity)

原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

2、一致性(Consistency)

一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。举例来说,假设用户A和用户B两者的钱加起来一共是1000,那么不管A和B之间如何转账、转几次账,事务结束后两个用户的钱相加起来应该还得是1000,这就是事务的一致性。

3、隔离性(Isolation)

隔离性是当多个用户并发访问数据库时,比如同时操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。

4、持久性(Durability)

持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务已经正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成。否则的话就会造成我们虽然看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。这是不允许的。

1、 脏读

脏读是指一个事务正在访问数据,并且对数据进行了修改,但是这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。

2、不可重复读

不可重复读是指在一个事务内,多次读取同一个数据。

在这个事务还没有结束时,另外一个事务也访问了该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。

3、 幻读

幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

不能重复读和幻读区别:
        ● 不可重复读是更新和删除操作
        ● 幻读是插入操作

1.2如何解决并发问题

SQL92标准

针对上面发生的并发问题, 很多数据库专家联合制定了一个标准, 也就是说建议数据库厂商都按照这个标准, 提供一定事务的隔离级别 来解决事务并发的问题, 这个就是 SQL92标准。

事务隔离级别

在谈隔离级别之前,你首先要知道,你隔离得越严实,效率就会越低。因此很多时候,我们都要在二者之间寻找一个平衡点

读未提交(READ UNCOMITTED) RU

顾名思义, 就是一个事务可以读到另一个事务未提交的数据。

读提交(READ COMMITTED)RC

一个事务可以读到另一个事务已提交的数据。解决脏读问题

可重复读(REPEATABLE READ)RR

事务开启后,只能读到该事务开启前已提交的数据。在同一事务下多次读取同一数据的结果是一样的。解决不可重复读问题

串行化(SERIALIZABLE)

在这个隔离界别里,所有的事务操作都要排队进行,已经不存在并发问题,因此解决了所有的问题。解决所有所有问题

视图

在实现上,数据库里面会创建一个视图,访问的时候以视图的逻辑结果为准。在“可重复读”隔离级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图。在“读提交”隔离级别下,这个视图是在每个 SQL 语句开始执行的时候创建的。这里需要注意的是,“读未提交”隔离级别下直接返回记录上的最新值,没有视图概念;而“串行化”隔离级别下直接用加锁的方式来避免并行访问。

我们可以看到在不同的隔离级别下,数据库行为是有所不同的。Oracle 数据库的默认隔离级别其实就是“读提交”,因此对于一些从 Oracle 迁移到 MySQL 的应用,为保证数据库隔离级别的一致,你一定要记得将 MySQL 的隔离级别设置为“读提交”。

配置的方式是,将启动参数 transaction-isolation 的值设置成 READ-COMMITTED。你可以用 show variables 来查看当前的值。


mysql> show variables like 'transaction_isolation';

+-----------------------+----------------+

| Variable_name | Value |

+-----------------------+----------------+

| transaction_isolation | READ-COMMITTED |

+-----------------------+----------------+

总结来说,存在即合理,每种隔离级别都有自己的使用场景,你要根据自己的业务情况来定。我想你可能会问那什么时候需要“可重复读”的场景呢?我们来看一个数据校对逻辑的案例。
假设你在管理一个个人银行账户表。一个表存了账户余额,一个表存了账单明细。到了月底你要做数据校对,也就是判断上个月的余额和当前余额的差额,是否与本月的账单明细一致。你一定希望在校对过程中,即使有用户发生了一笔新的交易,也不影响你的校对结果。
这时候使用“可重复读”隔离级别就很方便。事务启动时的视图可以认为是静态的,不受其他事务更新的影响。

1.3事务隔离的实现

LBCC

第一种,我既然保证两次读取的结果一样, 那么就直接上锁,锁定我要操作的数据,不允许其他事务修改就可以了。这种方案我们称为基于锁的并发控制 Lock Base Concurrency Controller(LBCC)。如果仅仅是基于锁的控制,那么就不支持并发了, 在实际情况下我们业务一般都是读多写少,这种方案显然不太可行。

MVCC

建议看看官方文档,很多说不清楚。 https://dev.mysql.com/doc/refman/8.0/en/innodb-multi-versioning.html

所以我们还有另一个种解决方案, 如果让一个事务两次读取的数据一致,那么我们可以在修改数据的时候建立一份备份或者叫快照,每次读取的时候我们都去读取快照。这种方案我们叫做多版本并发控制 Multi Version Concurrency Control (MVCC)。

MVCC思想是:我们可以查找事务开启前已经存在的数据,即使它后面被修改或者删除。在这个事务新增的数据我是查不到的。

1.4Mysql存储引擎

1、InnoDB存储引擎(默认存储引擎),支持事务安全表(ACID),支持行锁定和外键

设计遵循ACID模型,支持事务,具有从服务崩溃中恢复数据的能力,能够大限度包含用户的数据

支持行级所,可以提升多用户并发时的读写性能

支持外键,保持数据的一致性和完整性

innoDB拥有自己独立的缓冲池,常用的数据和索引都在缓存中

2、MyISAM存储引擎:MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事物。

默认MyISAM的表会在磁盘中产生三个文件:.frm、.MYD和.MYI
  MyISAM单表大支持的数据量是2的64次方条记录
  每个表多可以建立64个索引
  如果是复合索引,每个复合索引多包含16个列,索引值大长度是1000B
  MyISAM引擎的存储格式:定长(FIXED静态):是指字段中不包含VARCHAR\TEXTBLOB;动态(DYNAMIC):只要字段中包含VARCHAR\TEXTBLOB;压缩(COMPRESSED):myisampack创建

3、MEMORY存储引擎:将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问。

磁盘中产生一个以表名为名称的.frm文件,只保存表结构
  如果关闭MySQL服务,此时数据会产生都是rr
  max_head_table_size默认16MB

4、ARCHIVE存储引擎:

适合对于不经常访问又删除不了的数据做归档储存
.frm文件结构文件,.arz数据文件
插入效率很高,而且占用空间小
ARCHIVE存储引擎只支持INSERT和SELECT操作,不支持UPDATE/DELECT/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值