面试必会知识------数据库

事物


它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性

四个基本性质

事物是由一系列操作完成的,具有四个基本性质(ACID)

  1. 原子性(Atomicity):原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚
  2. 一致性(Consistency):一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
  3. 隔离性(Isolation):多个并发事务之间要相互隔离
  4. 持久性(Durability):持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的

事务隔离级别


可能存在的问题

脏读:是指在一个事务处理过程里读取了另一个未提交的事务中的数据(一个事物A读取了另一个事物B未提交的信息,而事物B由于问题进行了回滚操作,导致了事物A读取了不存在的事物。)

不可重复读:不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了(事物A读取了某条记录,事物B此时对这条记录进行了修改并提交,事物A再次读取信息时导致两次读取的信息不一致。)

幻读:幻读针对的是一批数据整体,如事物A统计了某些信息的数量,而事物B添加了一条相关的记录,事物A再次查询时统计信息是不一致的。

隔离级别

  • 未提交读(Read Uncommitted):

读事物不加锁;写事物加行级共享锁;

不能解决脏读、不可重复读及幻读

  • 读已提交(Read Committed):

读事物加行级共享锁,读取完成后立即释放锁;写事物加行级排它锁,直到事物结束才释放锁;

能解决脏读,不能解决不可重复读及幻读。

  • 可重复读(Repeatable reads):

读事物加行级共享锁,直到事物完成才释放锁;写事物加行级排它锁,直到事物结束才释放锁;

能解决脏读,可重复度;不能解决幻读

  • 可序列化(Serializable):

读事物加表级共享锁,直到事物完成才释放锁;写事物加表级排它锁,直到事物结束才释放;


乐观锁

假设不会发生并发冲突,不加锁,只在提交操作时检查是否违反数据完整性。 乐观锁不能解决脏读的问题

乐观锁就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。

比如 给 表加一个 时间戳的列,保存更新的时间

更新操作之前 先查询出 时间戳 timestamp,

更新是 update … set … time= 当前时间where … AND time = timestamp;

    Delete … where … AND time = timestamp;

修改的时候把时间戳改为当前时间。

如果事务A查询了时间戳之后,进行修改,而事务B这时候已经修改了改行,则事务A进行修改的时候会发现时间不一致,而导致不能修改。避免发生错误。

事务A可以不断重试,直到修改成功。这样可以不加锁而保证并发安全。但是对于并发量特别大的话,可能会导致不断地重试,而一直不能完成操作。通过添加版本号也是同样的道理。

悲观锁

与乐观锁相反, 每次去拿东西时都认为别人会修改,所以会加锁。锁有行级锁和表级锁。

InnoDB行锁是通过索引上的索引项来实现的,这一点MySQL与Oracle不同,后者是通过在数据中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将使用表锁

索引


聚集索引

包含记录的文件按照某个搜索码指定的顺序排序,那么该搜索码对应的索引称为聚集索引,聚集索引的搜索码常常是主码。(文件是排序存储的,一般按照主码进行排序)

非聚集索引

搜索码指定的顺序与文件中记录的物理顺序不同的索引称为非聚集索引。

猜你喜欢

转载自blog.csdn.net/u013514816/article/details/81836886