幻读、脏读、不可重复读详解说起来,数据库管理系统在写入或更新数据时,为了保证数据的正确可靠,需要满足四个特性:原子性、一致性,隔离和持久化,简称ACID!原子性(atomicity):一个事务(transaction)中的所有操作要么全部完成,要么全部未完成,不会在中间某个环节结束。如果事务执行过程中出现错误,可以恢复(Rollback)到事务开始前的状态,就好像事务从未执行过一样。一致性(consistency):事务开始前和事务结束后,不违反数据库的完整性。这意味着写入前后的数据必须与预期的设置结果完全匹配。隔离性:数据库允许多个并发事务同时读取、写入和修改其数据的能力。隔离可以防止多个事务并发执行时交叉执行导致的数据不一致。事务隔离分为不同的级别,包括未提交读(Readuncommitted)、已提交读(readcommitted)、可重复读(repeatableread)和序列化(Serializable)。持久性(persistence):事务处理结束后,对数据的修改是永久性的,即使系统出现故障也不会丢失。例如,以银行转账为例。从原账户扣除金额和向目标账户添加金额的两阶段操作,被视为一个完整的逻辑过程,不可分割。简单的说,要么全部成功,要么全部失败!这个过程称为事务,具有ACID的四个特点!说了这么多,跟我们今天要说的脏读、不可重复读、幻读有什么关系呢?我们都知道目前主流的数据库,都支持多事务并发执行。当一个事务在写入数据时,另一个事务也需要读取这个数据。会出现什么问题?当一个事务在写入数据时,另一个事务也需要写入这个数据。会出现什么问题?当多个事务并发处理同一条数据时,如果事务隔离不合理,就会出现我们今天要介绍的内容,具体来说:脏读、不可重复读、幻读!在事务的四个特性中,隔离性分为四个等级,从低到高分别是Readuncommitted、Readcommitted、Repeatableread、Serializable。这四个层次可以一一解决脏读、不可重复读、幻读。阅读这些类型的问题。readuncommitted:俗称readuncommitted,意思是当一个事务还没有提交时,它所做的修改可以被其他事务看到。Readcommitted:俗称readcommit,意思是一个事务提交后,它所做的修改会被其他事务看到。可重复读:俗称可重复读,是指事务执行过程中看到的数据,与事务开始时看到的数据始终保持一致。同时,当其他事务未提交时,更改是不可见的。Serializable:俗称序列化,顾名思义,对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当发生读写锁冲突时,后面访问的事务必须等待前面的事务完成后才能继续执行。不同的隔离级别产生不同的结果。下面就来详细分析分析吧!2.场景分析2.1脏读所谓脏读是指从其他事务中读取未提交的数据。未提交的意思是这些数据可能保存到数据库中,也可能回滚而不保存到数据库中。当数据回滚时,就意味着数据不存在,这就是脏读!脏读最大的问题就是可能读取到不存在的数据。比如上图中,事务B的更新数据被事务A读取,但是事务B被回滚,更新的数据全部恢复。也就是说,事务A刚刚读取的数据在数据库中是不存在的。从结果来看,事务A读取了一条不存在的数据。这个问题很严重!当数据库的事务隔离级别为readuncommitted时,就会出现脏读!2.2Non-repeatablereadNon-repeatableread,指在一个事务中,开始时读取的数据与事务结束前任意时刻读取的同一批数据不一致。比如上图中,事务A两次读取同一个数据,第一次读取的结果为1。当事务B修改数据并提交时,事务A的第二次读取结??果为2,而事务B的结果为两者读起来不一致!当数据库的事务隔离级别为readuncommitted或者readcommitted时,就会出现不可重复读!2.3幻读幻读和不可重复读有些相似,只是表达的侧重点不同。比如事务A修改了一个表中的数据,这个修改涉及到表中的所有数据行。此时,事务B突然插入一条数据并提交。事务A提交数据修改操作后,再次读取所有数据,发现还有一条数据没有更新。感觉像是幻觉。这是幻读!当有其他事务时,插入或删除同一条数据时,很容易出现幻读!当数据库的事务隔离级别为readuncommitted、readcommitted、repeatableread时,会出现幻读现象!三、如何解决以上问题,数据库使用锁机制来解决并发访问的问题。以Mysql为例,根据加锁对象的不同,可以分为行级锁和表级锁;根据并发事务锁之间的关系,可以分为共享锁和排它锁。共享锁防止独占锁,但允许其他共享锁;独占锁防止共享锁和其他独占锁;为了更改数据,数据库对正在更改的行施加行级独占锁,insert、update、delete和selsctforupdate语句都隐式地采用了必要的行锁定。当冲突加剧时,会上升到表级锁,影响其他表的访问操作。直接使用锁机制来管理是非常复杂的。基于锁机制,数据库为用户提供了不同的事务隔离级别。只要设置了事务隔离级别,数据库就会分析事务中的sql语句,自动选择合适的锁。有效解决脏读、不可重复读、幻读问题!总的来说,事务的隔离级别与数据库的并发度成反比。隔离级别越高,并发越低。4.总结标准主要关注什么是脏读、不可重复读和幻读。如果有些地方不太理解,欢迎网友们指出!、不可重复读、幻读2.数据库事务隔离级别
