简单理解:数据库的一致性与四种隔离级别(+MySQL实现)
并行数据库存在着几种常见不一致问题:
1.更新丢失:两个并发的写进程同时修改某内容,一个没修改完提交之后另一个又提交,导致其覆盖了第一个提交的写进程内容。
2.脏读:一个操作读到了另外一个操作没有提交的事物,但这个操作是不准确的,有可能被修改,比如回滚
3.不可重复度:同一次查找中的两次读的结果不一样。这里分为虚读和幻读,虚读是对于单条数据两次读不一样,幻读是第二次读比第一次读的结果集条数增多。
对应的数据库有四种隔离级别:
1.读未提交
写的时候禁止其他进程的写,这样两个写进程不能同时进程,也就不能出现更新丢失的问题。但写的进程不禁止读进程,这就还可能出现读脏数据。
2.读提交
写进程禁止读进程。只有写提交之后才能读,这样就防止了脏读现象的出现。但是注意此时读不禁止写,因为读脏数据和不可重复读不一样,读脏数据是指读到未提交的事物,不可重复度是两次读提交的事物都有可能不一样,读允许写,还会发生不可重复读现象,但是不能发生读脏数据现象。
3.可重复读
读禁止写,这时不会出现不可重复读,即两次读不一样的现象了
4.序列化
最严格的隔离机制,即只能严格的一个操作接一个执行,不能并发了
附加 :
MySQL实现事务的隔离机制:利用数据库锁+MVCC的机制实现。
- 读未提交:加排它锁,但排它锁只组织对其锁定数据加读或写的锁,对于不加锁读的读就不起作用,所以写禁止写,写不禁止读
- 读提交:写用排它锁,读是用MVCC机制,读当前版本,写的时候生成新版本,所以当前被锁住的版本不会出现脏读,但是会出现不可重复读(另一次读也拿到了被写过的最新版本。)
- 可重复读:READ COMMITTED级别不同的是MVCC版本的生成时机,即:一次事务中只在第一次select时生成版本,后续的查询都是在这个版本上进行,称为快照读。写也是只改变了当前版本号,但是select查询仍基于之前的版本号,解决了虚读,即不受改变影响,但插入数据的话,还是会出现幻读现象(条数不一致)。引入了next-Key(当前读)机制,当select为范围的时候,在数据之间加了间隙锁,不允许插入。
再附加:
什么是MVCC:
MVCC(多版本并发控制)多版本并发控制,顾名思义,在并发访问的时候,数据存在版本的概念,可以有效地提升数据库并发能力,常见的数据库如MySQL、MS SQL Server、IBM DB2、Hbase、MongoDB等等都在使用。简单讲,如果没有MVCC,当想要读取的数据被其他事务用排它锁锁住时,只能互斥等待;而这时MVCC可以通过提供历史版本从而实现读取被锁的数据的历史版本,从而避免了互斥等待。InnoDB采用的MVCC实现方式是:在需要时,通过undo日志构造出历史版本。
数据库的几类锁:
共享锁(其他可用但不能改,一般用于读锁),排它锁(其他不能上锁,但没法阻止不上锁的读),行锁(针对索引行),间隙所(针对索引间隙)
增删改都是要加排它锁,只有查select只有显示声明才加锁:
- select: 即最常用的查询,是不加任何锁的
- select ... lock in share mode: 会加共享锁(Shared Locks)
- select ... for update: 会加排它锁
最新文章
- dede使用方法----实现英文版的搜索功能
- 【iCore3 双核心板_ uC/OS-III】例程四:时间管理
- django构建blog--建立数据库部分+admin部分(eclipse+pydev)
- Java之--Java基础知识
- jdk在windows中的配置
- __file__ __name__ __doc__ argv详解
- Tortoisegit 记住用户名和密码
- 积累的VC编程小技巧之对话框
- [补档]vijos1883 月光的魔法
- buttongroup中content一次性加载的解决方法
- 【Sqlserver系列】【转载】事物与锁
- [转]调整 VirtualBox 虚拟机的磁盘大小
- JavaScript自定义求和函数
- Linux系统调用的运行过程【转】
- zzulioj 1734 堆
- XenServer修改DNS
- Python3基础 str + 字符串变量拼接
- 新增的input
- java:Filter、Listener 自定义拦截器和过滤器应用
- [POI2015]Pieczęć
热门文章
- JavaScript基础有关构造函数、new关键字和this关键字(009)
- JavaScript基础-自己定义自己的函数(016)
- 《JavaScript高级程序设计》(第二版)
- CentOS 的数字命令级别
- Centos 6.4 安装/卸载 Adobe Reader 9(.bin .tar.bz2 rpm 包)
- mybatis关于Criteria的一点小坑。。。
- Conda太慢?试试这个加速工具!
- web图片前端裁剪功能实现_利用html5 canvas技术实现图片裁剪
- 极致Web性能 —— SPA性能指南
- SCOI 2010 连续攻击游戏(贪心,图论)