事务的四大特性:
原子性:不可分割的操作单元,事务中所有的操作,要么全部成功,要买撤回到执行事务之前的状态
一致性:如果执行事务之前数据库是一致的,那么执行事务之后数据库也是一致的
隔离性:事务操作之间彼此独立和不透明互不影响,事务独立运行,通常使用锁来实现,一个事务处理后的结果,影响了其他事务,那么其他事务会撤回
持久性:事务一旦提交,其结果就是永久的。
事务隔离级别:
未提交读(read uncommmitted)未提交,允许脏读,其他事务只要是修改了数据,即使未提交,本事务也能看到修改后的数据值。
提交读(read commmitted):只能读取到已经提交的数据
可重复读(repeated read)数据,在这个事务中看到的数据值始终不受其他事务影响。
串行读,每次读都需要获得表级共享锁,读写互相都会阻塞
mysql数据库默认使用可重复读
索引相关:
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中的结构
mysql四大索引:
index:普通索引,数据可以重复,没有任何限制
unique:唯一索引,要求索引列的值必须唯一,但允许有空值,如果是组合索引,那么列值的组合必须唯一
primary key :主键索引,是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值,一般是在创建表的同时创建主键索引
组合索引:在多个字段上创建索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被引用。
sql语句分类:
DDL:数据定义语言(create drop)
DML:数据操作语句(insert update delete)
DQL:数据查询语句(select )
DCL:数据控制语句,进行授权和权限回收(grant revoke)
TPL:数据事务语句(commit collback savapoint)
数据库的三大范式:
第一范式:1NF是对属性的原子性约束,要求字段具有原子性,不可再分解性
第二范式:2NF是在第一范式的前提下,非主键字段不能出现部分依赖主键,解决:消除复合主键就可以避免出现部分以来,可增加单列关键字
第三范式:3NF是在满足第二范式的前提下,非主键字段不能出现传递依赖,比如某个字段a依赖于主键,而一些字段依赖字段a,这就是传递依赖,解决:将一个实体信息放在一个表内实现
脏读、幻读、不可重复读:
脏读:是指将事务T1将某一值修改,然后事务T2读取该值,之后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到数据是无效的
不可重复读:是指数据库访问时,一个事务范围内的两次相同查询却返回了不同的数据。在一个事务内多次都同一数据,在这个事务还没有结束是,另一个事务也访问到了该同一数据,那么在第一个事务中的两次数据之间,由于第二个事务的修改,导致了第一个事务两次读取到的数据可能是不一样的,因此称为不可重复读。
幻读:是指当事务不是独立指向时发生的一种现象,比如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中全部的数据行。同时,第二个事务也修改了这个表中的数据,这种修改是向表中插入一行新数据,那么就会发生,操作第一个属事务的用户发现表中还有没有修改的数据行,就好像发生了幻觉一样
不可重复读&幻读的区别:
如果使用锁机制来实现这两种隔离级别,在可重复读中,该sql第一次读取到数据后,就将这些数据加锁,其他事务无法修改这些数据,就可以实现可重复读了。但这种方法无法所著insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,那么事务B还是可以insert数据提交,这时事务A就会莫名其妙多了一条之前没有国平的数据,这就是幻读,不能通过行锁俩避免。需要串行隔离级别,读用读锁,写用写锁,读锁和写锁互斥,
delete、drop、truncate区别:
- 删除数据的速度,drop> truncate > delete
- delete属于DML语言,需要事务管理,commit之后才能生效。drop和truncate属于DDL语言,操作立刻生效,不可回滚。
- 使用场合:
- 当你不再需要该表时, 用 drop;
- 当你仍要保留该表,但要删除所有记录时, 用 truncate;
- 当你要删除部分记录时(always with a where clause), 用 delete.
Mysql中的所类型:
MyISAM支持表锁,InnoDB支持表锁和行锁,默认行锁
表级锁:开销小,加锁快,不会出现死锁。锁定力度大,发生锁冲突的概率最高,并发量最低
行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生所冲突的概率小,并发度最高
存储过程:
sql执行时候需要先编译,然后执行
存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数来调用执行它
一个存储过程是一个可编程的函数,它在数据库中创建并保存,它可以由SQL语句和一些特殊的控制结构组成,当希望在不同的应用程序或者平台上执行相同的函数,或者封装特定功能时,据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。