三范式

第一

字段不可再分

第二

所有字段必须依赖于一个主键

第三

不能出现传递依赖,也就是a依赖b,b依赖主键c

事务的四大特性

原子性

要么全部成功,失败一个就回滚

一致性

一致性和原子性联系紧密,一个人给另一个人转账,如果扣除成功,要么另一个账户到账,要么退回,不能凭空消失,可以说要平账,甚至可以引申为能量守恒。

隔离性

一个事务不会被另一个事务干扰

持续性

指一个事务一旦提交,对数据库的改变是永久性了。 MySQL的事务隔离级别

串行化>可重复读>读已提交>读未提交

串行化

让事务排队执行,避免冲突,解决幻读问题

可重复读(mysql默认)

事务读取一个数据时,其他事务无法读取,有幻读问题

读已提交(spring默认)

一个事务使用一条数据时,其他事务只能读取到数据被使用前的值,可以避免脏读,但还有不可重复读问题

读未提交(Oracle没有这个)

所有事务可以看到其他未提交事务的执行结果,有脏读问题

  1. 幻读:一个事务根据读取的数据执行的结果和预期的不一致,可能因为被其他线程执行的结果干扰了。
  2. 不可重复读:事务对一个数据多次读取的结果不一样,可能被其他事务干扰了。
  3. 脏读:一个事务还没提交的结果被其他事务读取了。 常见的存储引擎MyISAM 级锁
  4. 全局锁

锁住是所有数据库都变成只读状态

  1. 问题

在主库上备份,在备份期间无法更新,业务停摆
在从库上备份,无法执行主库同步过来的二进制文件,会导致主从延迟

  1. 解决

在备份时加上参数—single-transaction完成不加锁的数据一致性备份

表级锁

表锁

读锁

所有客户端只能读,不能写

写锁

当前客户端可以读写,其他客户端无法读写

元数据锁(MDL)

在表上有活动事务时自动加锁,无法对元数据写入。由系统自动控制,在访问一张表时自动加上。


MyISAM和InnoDB的区别?

  1. InnoDB行级锁,支持表级锁;MyISAM支持表级锁
  2. InnoDB支持事务、外键、聚簇索引、MVCC