数据库是一个多用户共享的资源,这样的话对于多个用户在存取同一数据的时候,就会出现问题,举个最经典的问题—-票务系统,如何保证数据的正确性。当只剩下最后1张票的时候,两个用户同时取到数据并更新,那么最后是谁买到票了呢?
数据库事务
数据库事务是指单个逻辑工作单元执行一系列操作,要么完成执行,要么完成不执行。数据库事务必须满足ACID(原子性、一致性、隔离性、持久性)。
- 原子性:对于其数据的修改,要么全部执行,要么完全不执行。原子性消除了系统处理操作子集的可能。
- 一致性:事务完成时,必须是所有的数据都保持一致
- 隔离性:由并发事务所做的修改必须与任何其他事务并发事务所做的修改隔离
- 持久性:完成事务后,对系统的修改时永久性的
事务隔离级别
- 未提交读:当前事务未提交、其他事务也能读到
- 提交读:当前事务提交之后,其他事务才能看到
- 可重复读:该级别解决了同一事务多次读取同样记录的结果是一致的。但是理论上,还是无法解决另一个幻读问题。幻读 是指当前事务读取某个范围内的记录时,其他事务在该范围又加入新的纪录,之前的事务再次从该范围读取数据时,会产生幻行。这个的换行是对于 insert 操作来说的,对于 update 操作能保证没有幻行问题。
- 可串行化:最高的事务隔离级别。强制事务串行化执行,避免了幻读问题,这种级别会在数据的每一行都加锁,会产生大量的超时和锁竞争,实际中很少用到,除非要确保数据的一致性且没有并发问题
怎么理解脏读、不可重复读和幻读
脏读
脏读是读到了未提交事务的数据。只有在读未提交隔离级别下,才会出现脏读。