MySQL存储引擎和事务

以前学MySQL只是学些基本操作,前段时间学习了存储引擎,索引,事务这些概念,写篇博客记录一下,方便自己以后查阅以及供其他需要者参考。

MySQL是一种关系型数据库,开源免费,方便扩展,关系型数据库的特点是将数据保存在不同的表中,再将这些表放入不同的数据库中,而不是将所有的数据统一放在一个仓库里,这样的设计加快了MySQL的读取速度,提高了它的灵活性和可管理性。访问及管理MySQL数据库的最常用标准化语言为SQL——结构化查询语言。结构化查询语言使得数据库的存取和更新数据的操作变得更加容易。

 

1.存储引擎

用cmd打开MySQL,输入

show engines;

查看MySQL提供的所有存储引擎(下图为MySQL8.0)

从图中可以看出MySQL8.0的默认存储引擎是InnoDB,且只有InnoDB支持事务。

MySQL5.5之前,默认数据库引擎为MyISAM,虽然性能良好,支持全文索引,表级锁等,但是并不支持事务和行级锁。MySQL5.5之后,引入了InnoDB,默认数据库引擎改为了InnoDB,支持事务、行级锁和表级锁(默认为行级锁)。

MyISAM与InnoDB的比较

MyISAM:只支持表级锁;每次查询具有原子性,性能相对较高,但是不支持事务;不支持外键。

InnoDB:支持行级锁和表级锁,默认为行级锁;支持事务,能进行回滚操作,事务相对安全;支持外键。

MySQL索引

MySQL索引有B+树索引和哈希索引等;哈希索引底层数据结构是哈希表,所以单条记录查询时,选择哈希索引查询较快,其他大部分场景使用B+树索引。

 

2.事务

事务的概念:小黑给小白转账100元,看起来好像是一个操作,实际上数据库会进行两步操作,先把小黑的账户减掉100元,再给小白的账户加上100元。如果这两个操作之间出现问题,比如银行的系统崩溃了,那么就有可能导致小黑的账户减掉100元,而小白的账户并没有加上100元。事务就是保证这两个操作要么都成功,要么都失败。

事务的四大特性(ACID)

  • 原子性:事务是最小执行单位,不可分割。原子性确保了操作要么全部完成,要么全部失效
  • 一致性:事务执行的前后,数据保持一致,多个事务对同一个数据读取的结果是一样的
  • 隔离性:并发访问数据库时,一个用户的事务不会被其他事务干扰
  • 持久性:也该事务被提交后,它对数据库中数据的改变是持久的,数据库发送故障也不会产生影响

并发事务的问题

多个事务并发运行时,多个用户经常会对同一数据进行操作,这就会导致出现一些问题

  • 脏读:一个事务访问数据库并对数据进行了修改,但是这个修改还没有被提交到数据库中,这时另一个事务也访问了这个数据,并使用了这个数据。因为这个数据是还没有提交的数据,所以另外一个事务读到的这个数据就是错误的数据,也就是脏数据
  • 幻读:一个事务读取了几行数据,接着另一个并发事务插入了一些数据,这就会导致第一个事务在之后的查询中会发现多了一些原来并不存在的数据,就跟发生幻觉一样
  • 不可重复读:一个事务要执行多次读取同一数据的操作,在这个事务还没有结束时,另一个事务修改了该数据,在第一个事务的两次读取数据之间,由于第二个事务的修改导致第一个事务两次读取到的数据是不一样的,因此称为不可重复度

事务的隔离级别

  • 读未提交:隔离级别最低,允许读取未提交的数据,可能会发生脏读,幻读和不可重复度
  • 读已提交:允许读取已提交的数据,可以防止出现脏读,可能会发生幻读和不可重复读
  • 可重复读:对同一数据的多次读取的结果都是一样的,可以防止出现脏读和不可重复度,可能会发生幻读
  • 串行化:隔离级别最高,服从ACID的隔离级别,可以防止出现脏读、幻读和不可重复度
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章