关于数据库隔离级别,一共四个隔离级别,未授权读取/ 授权读取/ 可重复读取/ 序列化 整理如下,记录一下:
料风味整理 2019.04.03 | 状态 | 写事务 | 读事务 | 影响 | 应用 | ||||||
Read uncommitted | 写事务开启中 | 禁止 | 允许 | 写事务开始的时候也可以读,可能会导致脏读,不一致读取,幻读。 当时因为禁止了写事务,可以保证更新不丢失。 | excel表在不少情况下是这个级别,比这个级别还低的是text文件,即没有任何隔离 | ||||||
未提交读取/读未提交/未授权读取 | 读事务开启中 | 允许 | 允许 | 读事务如果处理的流程很长,中间有并发写事务,也可能导致脏读、不一致读取、幻读 | |||||||
Read committed | 写事务开启中 | 禁止 | 禁止 | 因为写事务开启,禁止其他一切事务进行,所以写事务具有原子性。这样就不会有脏读。要么读取的是修改之前的数据,要么是之后的数据 | 是Oracle和Sql server的默认隔离级别 | ||||||
提交后读取/读提交/授权读取 | 读事务开启中 | 允许 | 允许 | 读事务开启中,如果有写事务是允许的,但这里的写事务是有原子性的。所以一个读事务如果前后有两次或多次读取,这些读取的数据可能是不一致的。这就是傻帽翻译的“不可重复读取。” 另外,也可能存在幻读了。 | |||||||
Repeatable read | 写事务开启中 | 禁止 | 禁止 | 不会出现脏读和不重合读取 | 是mySQL的默认隔离级别 | ||||||
可重复读取/一致读取/重合读取 | 读事务开启中 | 禁止(非完全) | 允许 | 因为读事务禁止了写事务,所以update和delete都是不行的,所以不会出现不一致的读取。 但是由于未知行的不存在,无法加锁,所以insert语句还是可以在读事务中间执行,所以可能出现幻读。 | |||||||
Serializable | 写事务开启中 | 禁止 | 禁止 | 事务只能一个接着一个地执行,不能并发执行。仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。 | 一般很少用,因为性能影响太大,效率太低 | ||||||
序列化/串行化执行 | 读事务开启中 | 禁止 | 禁止 | ||||||||
写事务 | 指的是对数据进行编辑,包含修改和删除,也含新增 | ||||||||||
读事务 | 读事务是专指只进行查询的事务 | ||||||||||
脏读取 | 读取的是修改中的未保存的数据,与修改提交后保存在数据库的数据不一致 | ||||||||||
不可重复读取 | 可以理解为一个读事务中前后两次或多次读取同一行读出来的数据不一致。又可以翻译为“不一致读取”,或者是“前后读不一致”,或者是“不重合读取”,或者是“有差异读取”,翻译这么多是认为之前的翻译太垃圾了 | ||||||||||
幻读 | 在读事务的中间,虽然读事务已经对行进行了加锁,禁止update和delete,但是因为无法对不存在的语句加锁,所以事务中可能存在insert进入新语句的情况,所以在一个读事务中如果前后有两次读取,这两次读取的数据的总条数可能不一样,这称为幻读。 | ||||||||||
更新丢失 | 修改保存后发现修改的内容没有成功保存到数据库,或者保存后又马上被其他保存覆盖,导致修改信息丢失。text文档在打开多个的情况下,中间保存都可能更新丢失,如果最后一个文件是save,那么以最后更新的为准,其他的更新都丢失。 |
不足或有错误之处,欢迎指出!