前言
自从大三学完数据库后,这门课就没再看过。最近要找实习了,发现面试总避免不了要问数据库相关的问题,回过头去找课本,才发现书都已经被我扔了。。。只能根据网上的数据库面试题来复习了。
数据库事务的四个特征
ACID,分别对应Atomicity、Correspondence、Isolation、Durability
- 原子性:事务的所有操作,要么全部完成,要么全部不完成,不能停滞在中间环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务没有执行过一样。其保证了一致性,避免了事务执行当中(此时是不一致的)对外可见。
- 一致性:在事务的开始前和执行后,数据库的完整性约束没有被破坏。指事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
- 实际上数据库的一致性是人为定义的,该由编写该事务的程序员来确保。
- 完整性检查:
- 单个关系的完整性约束:not null、unique、check(谓词)等
- 参照完整性,对应的操作有delete cascade、update cascade等
- 断言:表示数据库任何时候都应该满足的一个条件
- 隔离性:多个事务并发执行时,一个事务的执行不应影响其他事务的执行。虽然同一时间可能有多个事务会并发执行,但是系统保证,对于任意一事务来说,都感觉不到别的事务在并发执行,而是在它之前或者之后执行。
- 脏读:A修改了数据,还未提交,B读取了这个修改的数据,最后A提交失败,那B读到的就是脏数据。(read uncommitted隔离会看到)
- 不可重复读:一个事务多次读取同一数据,结果却不一样。第一次与第二次读取之间,数据被别的事务修改了。强调的是数据被修改了(read committed隔离会看到)
- 幻读:和可重复读类似,但是另一个事务对数据的影响不是修改,而是新增或者删除,读取的记录数量前后不一致(repeated read隔离会看到,
innodb默认的隔离级别为repeated read
) - 常见的解决办法是串行执行,但是效率低。所以会有并发控制系统,来使事务并发执行,同时保证隔离性。(当我们将当前会话的隔离级别设置为serializable的时候,其他会话对该表的写操作将被挂起。可以看到,这是隔离级别中最严格的&