脏读、幻读、不可重复读和丢失更新实例
2017年6月5日,天气——雨。
前两天整理之前的学习笔记时,发现对事务并发产生的问题——脏读、幻读、不可重复读和丢失更新这些概念有点模糊,于是又重新温习了一遍,现在把自己的一些理解归纳整理如下,方便大家学习。
锁就是防止其他事务访问指定资源的手段。锁是实现并发控制的主要方法,是多个用户能够同时操纵同一个数据库中的数据而不发生数据不一致现象的重要保障。 一般来说,锁可以防止脏读、不可重复读和幻读。
1.脏读(Dirty Read)——一个事务读取到了另外一个事务没有提交的数据。
详细解释:当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。
事务T1:更新一条数据
-->事务T2:读取事务T1更新的记录
事务T1:调用commit进行提交
此时事务T2读取到的数据是保存在数据库内存中的数据,称为脏数据,这个过程称为脏读。
脏读发生在一个事务A读取了被另一个事务B修改,但是还未提交的数据。假如B回退,则事务A读取的是无效的数据。这跟不可重复读类似,但是第二个事务不需要执行提交。
解决脏读问题:修改时加排他锁,直到事务提交后才释放,读取时加共享锁,读取完释放事务1读取数据时加上共享锁后(这样在事务1读取数据的过程中,其他事务就不会修改该数据),不允许任何事务操作该数据,只能读取,之后1如果有更新操作,那么会转换为排他锁,其他事务更无权参与进来读写,这样就防止了脏读问题。但是当事务1读取数据过程中,有可能其他事务也读取了该数据,读取完毕后共享锁释放,此时事务1修改数据,修改完毕提交事务,其他事务再次读取数据时候发现数据不一致,就会出现不可重复读问题,所以这样不能够避免不可重复读问题。
2.幻读(Phantom)——同一事务中,用同样的操作读取两次,得到的记录数不相同。
详细解释:幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
事务T1:查询表中所有记录
-->事务T2:插入一条记录
-->事务T2:调用commit进行提交
事务T1:再次查询表中所有记录
此时事务T1两次查询到的记录是不一样的,称为幻读。
注意:幻读重点在新增或删除。
幻读发生在当两个完全相同的查询执行时,第二次查询所返回的结果集跟第一个查询不相同。
发生的情况:没有范围锁。
如何避免:实行序列化隔离模式,在任何一个低级别的隔离中都可能会发生。
解决幻读问题:采用的是范围锁RangeS RangeS_S模式,锁定检索范围为只读,这样就避免了幻读问题。
3.不可重复读(Nonrepeatable Read)——在同一事务中,两次读取同一数据,得到内容不同。
事务T1:查询一条记录
-->事务T2:更新事务T1查询的记录
-->事务T2:调用commit进行提交
事务T1:再次查询上次的记录
此时事务T1对同一数据查询了两次,可得到的内容不同,称为不可重复读。
注意:不可重复读重点在修改。
在基于锁的并行控制方法中,如果在执行select时不添加读锁,就会发生不可重复读问题。
在多版本并行控制机制中,当一个遇到提交冲突的事务需要回退但却被释放时,会发生不可重复读问题。
有两个策略可以防止这个问题的发生:
(1) 推迟事务2的执行,直至事务1提交或者回退。这种策略在使用锁时应用。
(2) 而在多版本并行控制中,事务2可以被先提交,而事务1继续执行在旧版本的数据上。当事务1终于尝试提交时,数据库会检验它的结果是否和事务1、事务2顺序执行时一样。如果是,则事务1提交成功;如果不是,事务1会被回退。
解决不可重复读问题:读取数据时加共享锁,写数据时加排他锁,都是事务提交才释放锁。读取时候不允许其他事物修改该数据,不管数据在事务过程中读取多少次,数据都是一致的,避免了不可重复读问题。
4.丢失更新(Lost Update)
事务T1读取了数据,并执行了一些操作,然后更新数据。事务T2也做相同的事,则T1和T2更新数据时可能会覆盖对方的更新,从而引起错误。
5.处理以上隔离级别的问题,采用如下方法:
事务隔离五种级别:
(1)TRANSACTION_NONE 不使用事务。
(2)TRANSACTION_READ_UNCOMMITTED 允许脏读。
(3)TRANSACTION_READ_COMMITTED 防止脏读,最常用的隔离级别,并且是大多数数据库的默认隔离级别。
(4)TRANSACTION_REPEATABLE_READ 可以防止脏读和不可重复读。
(5)TRANSACTION_SERIALIZABLE 可以防止脏读,不可重复读取和幻读,(事务串行化)会降低数据库的效率。
以上的五个事务隔离级别都是在Connection接口中定义的静态常量,使用setTransactionIsolation(int level) 方法可以设置事务隔离级别。
如:con.setTransactionIsolation(Connection.REPEATABLE_READ)。
注意:事务的隔离级别受数据库的限制,不同的数据库支持的的隔离级别不一定相同。
以上是脏读、幻读、不可重复读和丢失更新实例的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

<p>Xlive.dll是Microsoft的一个动态链接库(DLL),它是“WindowsLive游戏”的一部分。由Xlive.dll引起的错误可能是由于Xlive.dll文件的删除、放错位置、被恶意软件损坏或注册表项搞砸了。由于此错误而无法启动程序或游戏可能会令人沮丧。让我们看看解决这个问题的方法。此问题通常可以通过正确重新安装Xlive.dll文件来解决。</p><p><strong&

很多小伙伴用右键点击桌面的时候,发现列表里的新建不见了,这是怎么一回事呢?有可能是杀毒软件自动清理了一些文件,其实我们只要进入设置里调整一下数值就可以恢复了,具体的教程下面跟小编一起来看看吧。恢复Win10右键新建的步骤第一步,“win+R”打开运行,输入:regedit,点击“确定”,打开注册表编辑器第二步,在打开的注册表编辑器窗口,展开HKEY_CLASSES_ROOT,在HKEY_CLASSES_ROOT展开项中找到:Directory,再依次展开:Directory\Background

如何解决win7计算机中d3dx9_43.dll丢失的问题?3dx9_43.dll是计算机系统组件中directX9的dl组件。没有这个组件玩游戏,就会有游戏无法启动这个程序的提示。想解决的用户应该看看win7计算机中d3dx9_43.dl丢失的解决方案。d3dx9_43.dll丢失在win7计算机中的解决方案。1.从网上下载或复制d3dx9_43.dll文件_43.dll文件。将d3dx9_43.dll文件保存到系统中的System32目录下;3.按Win+R打开操作,输入regsvr32d3

我们在使用安装了win10操作系统的电脑时,有的情况下可能就会遇到libcurl.dll组件丢失的情况。对于这种问题小编觉得我们可以在网上下载一个这样的组件,然后解压安装到我们的系统文件夹里,重启电脑即可。具体操作步骤就让小编来告诉你怎么做吧~希望可以帮助到你。win10电脑libcurl.dll丢失怎么办1、从其他相同系统的计算机的C:\Windows\SysWOW64(64位win10)或C:\Windows\System32(32位win10)录路径中复制libcurl.dll动态链接库文

多数人都认为Ubuntu通过UbuntuSoftwareCenter彻底改革了dpkg包管理。毫无疑问,按照多数人标准来看,SoftwareCenter肯定是用户友好的呢。但事实真是如此么?本文将介绍Ubuntu软件管理的现状,伴随着Ubuntu首次发布的软件管理走了多远,以及Ubuntu软件领先的地方。一切从apt开始Ubuntu软件管理的纯粹形式使用apt打包工具,最先内置在很棒的但常被低估的Linux版本Debian中。可使用apt安装、移除或者更新Ubuntu上的软件。要完全清除软件,可

在日常生活中,手机已经成为我们不可或缺的工具,我们存储了大量的个人信息和重要数据在手机上。因此,一旦手机丢失或被盗,不仅会造成经济损失,还可能泄露隐私信息。而对于华为手机用户来说,丢失手机后如何定位手机的具体位置成为一个迫切需要解决的问题。华为手机具有一系列智能定位功能,用户可以通过多种方式来找回丢失的手机。首先,用户可以利用华为提供的“查找手机”服务来定位

当计算机程序打开时,系统提示不能启动该程序,因为MSVCR110.dll丢失在计算机中,试图重新安装该程序以解决这个问题。在win10计算机中丢失msvcr110.dll怎么办?由于现在所有的5.5环境都是基于vc11编译脚本生成的,所以你必须在windows下安装相关组件。让我们和小编一起看看具体的方法。在win10计算机中丢失msvcr110.dll怎么办首先,打开浏览器,在浏览器中下载相关程序。打开后,在选择语言中选择简体中文,然后点击右边的下载按钮。二、此时会弹出一个要求我们下载的程序选

在mysql中,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影”行。所谓的幻读,就是通过SELECT查询出来的数据集并不是真实存在的数据集,用户通过SELECT语句查询出某条记录是不存在的,但是它有可能在真实的表中是存在的。
