本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
数据库知识
事务的特性
-
原子性
事务开始后的所有操作,要么全部成功,要么全部不做。执行过程中出错,事务回滚到执行前的状态
-
一致性
事务开始前和结束后,数据库的完整性约束没有被破坏
-
隔离性
事务A和事务B同时执行彼此之间没有干扰
-
持久性
事务完成后,事务对数据库的所有更新操作会存储到数据库,不能回滚
事务并发引发的问题
-
脏读
事务A读取事务B更新的数据,然后B回滚,事务A读到的数据为脏数据,与表中的最终实际数据不一致
-
不可重复读
事务A多次读取同一数据,事务B在事务A读取过程对数据做了更新并提交,导致事务A多次读取同一数据却结果不一样。读取结果和上次不一样
-
幻读
一个事务读到另一个事务新增加并提交的数据
-
总结:不可重复读发生在数据修改时,幻读主要发生在新增和删除操作时
事务的隔离级别
| 事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| 读未提交(read-uncommitted) | 是 | 是 | 是 |
| 读已提交(read-committed) | 否 | 是 | 是 |
| 可重复读(repeatable-read) | 否 | 否 | 是 |
| 串行化(serializable) | 否 | 否 | 否 |
-
读未提交
read-uncommitted,一个事务可以读取另一个未提交事务的数据
-
读已提交
read committed,一个事务要等另一个事务提交后才能读取数据
-
可重复读
repeatable read,在开始读取数据(事务开启)时,不再允许修改操作
-
串行化
serializable,将每个事务按一定的顺序去执行,它将隔离问题全部解决,但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
MYSQL三大范式
-
第一范式(1NF)
数据表的每一列都要保持它的原子特性,也就是列不能再被分割。
-
第二范式(2NF)
在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
-
第三范式(3NF)
在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。消除传递函数依赖。