并行数据库存在着几种常见不一致问题:

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: 会加排它锁

最新文章

  1. dede使用方法----实现英文版的搜索功能
  2. 【iCore3 双核心板_ uC/OS-III】例程四:时间管理
  3. django构建blog--建立数据库部分+admin部分(eclipse+pydev)
  4. Java之--Java基础知识
  5. jdk在windows中的配置
  6. __file__ __name__ __doc__ argv详解
  7. Tortoisegit 记住用户名和密码
  8. 积累的VC编程小技巧之对话框
  9. [补档]vijos1883 月光的魔法
  10. buttongroup中content一次性加载的解决方法
  11. 【Sqlserver系列】【转载】事物与锁
  12. [转]调整 VirtualBox 虚拟机的磁盘大小
  13. JavaScript自定义求和函数
  14. Linux系统调用的运行过程【转】
  15. zzulioj 1734 堆
  16. XenServer修改DNS
  17. Python3基础 str + 字符串变量拼接
  18. 新增的input
  19. java:Filter、Listener 自定义拦截器和过滤器应用
  20. [POI2015]Pieczęć

热门文章

  1. JavaScript基础有关构造函数、new关键字和this关键字(009)
  2. JavaScript基础-自己定义自己的函数(016)
  3. 《JavaScript高级程序设计》(第二版)
  4. CentOS 的数字命令级别
  5. Centos 6.4 安装/卸载 Adobe Reader 9(.bin .tar.bz2 rpm 包)
  6. mybatis关于Criteria的一点小坑。。。
  7. Conda太慢?试试这个加速工具!
  8. web图片前端裁剪功能实现_利用html5 canvas技术实现图片裁剪
  9. 极致Web性能 —— SPA性能指南
  10. SCOI 2010 连续攻击游戏(贪心,图论)