MYSQL基础知识

57 阅读4分钟

MYSQL 

引擎:常用的有MyISAM,InnoDB。

MyISAM,InnoDB的区别:

1、存储文件,MyISAM每个表有2个文件,数据文件MYD和索引文件MYI, 而 InnoDB每个表只有一个文件,.idb文件。

2、InnoDB支持事务,行级锁,支持外键。

3、InnoDB支持XA事务

4、InnoDB支持SavePoints ,实现部分回滚

1. 脏读(Dirty Read)

脏读指的是一个事务读取了另一个事务尚未提交的数据。

2、幻读(Phantom Read)

幻读是指当两次相同的查询在事务期间执行时,第二次查询返回了一些新插入的行。

3. 不可重复读(Non-repeatable Read)

不可重复读指的是一个事务在相同的查询中多次读取同一行数据时,得到了不同的结果

事务的ACID属性是数据库管理系统(DBMS)中事务处理的核心特性,确保事务的可靠性和数据的完整性。ACID是四个英文单词的首字母缩写,分别代表:

  1. 原子性(Atomicity)

   - 原子性意味着事务中的所有操作要么全部完成,要么全部不完成。如果事务中的某个操作失败,那么事务将完全回滚,就像从未发生过一样。原子性确保了事务中的数据修改要么完全应用,要么完全不应用。

  1. 一致性(Consistency)

   - 一致性确保数据库在事务执行前后都保持一致的状态。事务必须使数据库从一个一致性状态转换到另一个一致性状态。这意味着事务执行的结果必须符合所有预定义的规则和约束,包括数据的完整性约束。

  1. 隔离性(Isolation)

   - 隔离性保证了并发执行的事务之间的相互隔离,事务的执行不应该互相干扰。不同的事务可以并发执行,但对数据的修改应该是透明的,直到事务提交。隔离性通过不同的隔离级别来实现,如读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。

  1. 持久性(Durability)

   - 持久性意味着一旦事务被提交,它对数据库的修改就是永久性的,即使在系统故障的情况下也不会丢失。一旦事务提交,它对数据库所做的更改将被保存在持久化存储中,如磁盘。

ACID属性是数据库事务的基础,它们共同工作以确保数据库的可靠性和数据的完整性。不同的数据库系统可能在实现这些属性时有所不同,但它们的核心概念是一致的。例如,MySQL 的 InnoDB 存储引擎就是遵循 ACID 属性的事务型存储引擎。

缓存在高版本删除了

  1. 事务的概念是什么? 2. mysql的事务隔离级别读未提交, 读已提交, 可重复读, 串行各是什么意思? 3. 读已提交, 可重复读是怎么通过视图构建实现的? 4. 可重复读的使用场景举例? 对账的时候应该很有用? 5. 事务隔离是怎么通过read-view(读视图)实现的? 6. 并发版本控制(MCVV)的概念是什么, 是怎么实现的? 7. 使用长事务的弊病? 为什么使用常事务可能拖垮整个库? 8. 事务的启动方式有哪几种? 9. commit work and chain的语法是做什么用的? 10. 怎么查询各个表中的长事务? 11. 如何避免长事务的出现?

读未提交是指,一个事务还没提交时,它做的变更就能被别的事务看到。

读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。

可重复读是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。

串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

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