面经-数据库
事务指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚。
ACID
1.原子性(A)
一、并发一致性问题
在并发环境下,事务的隔离性很难保证,因此会出现很多并发一致性问题
丢失修改
丢失修改指一个事务的更新操作被另外一个事务的更新操作替换。例如:T1和T2两个事务都对一个事务进行修改,T1先修改并提交生效,T2随后修改,T2的修改覆盖了T1的修改。读脏数据
读脏数据指在不同事务下,当前事务可以读到另外事务未提交的数据。例如:T1修改一个数据但未提交,T2随后读取这个数据。如果T1撤销了这次修改,那么T2读取的是脏数据。不可重复读
不可重复读指在一个事务内多次读取同一个数据集合。在这一事务还未结束前,另一事务也访问了该同一数据集合并做了修改,由于第二个事务的修改,第一次事务的两次读取的数据可能不一致。例如:T2读取一个数据,T1对该数据做了修改。如果T2再次读取这个数据,此时读取的结果和第一次读取的结果不同。幻影读
幻读本质上也属于不可重复读的情况,T1读取某个范围的数据,T2在这个范围内插入新的数据,T1再次读取这个范围的数据,此时读取的结果和第一次读取的结果不同。
产生并发不一致问题的主要原因是破坏了事务的隔离性,解决方法是通过并发控制来保证隔离性。并发控制可以通过封锁来实现,但是封锁操作需要用户自己控制,相当复杂。数据库管理系统提供了事务的隔离级别,让用户以一种更轻松的方式处理并发一致性问题。
二、封锁
三、隔离级别
未提交读(READ UNCOMMITTED)
事务中的修改,即使没有提交,对其他事务也是可见的提交读(READ COMMITTED)
一个事务只能读取已经提交的事务所做的修改可重复读(REPEATABLE READ)
保证在同一个事务中多次读取同一数据的结果是一样的可串行化(SERIALIZABLE)
强制事务串行执行,这样多个事务互不干扰,不会出现并发一致性问题。
该隔离级别需要加锁实现,因为要使用加锁机制保证同一时间只有一个事务执行,也就是保证事务串行执行。