原文转自;http://www.cnblogs.com/xwdreamer/archive/2011/01/18/2297042.html
SQL-92标准中定义了四个隔离级别,这四个隔离级别在以前版本的SQL Server中即受到支持:
READ UNCOMMITTED
READ UNCOMMITTED是限制性最弱的隔离级别,因为该级别忽略其他事务放置的锁。使用READ UNCOMMITTED级别执行的事务,可以读取尚未由其他事务提交的修改后的数据值,这些行为称为“脏”读。这是因为在Read Uncommitted级别下,读取数据不需要加S锁,这样就不会跟被修改的数据上的X锁冲突。比如,事务1修改一行,事务2在事务1提交之前读取了这一行。如果事务1回滚,事务2就读取了一行没有提交的数据,这样的数据我们认为是不存在的。
READ COMMITTED
READ COMMITTED(Nonrepeatable reads)是SQL Server默认的隔离级别。该级别通过指定语句不能读取其他事务已修改但是尚未提交的数据值,禁止执行脏读。在当前事务中的各个语句执行之间,其他事务仍可以修改、插入或删除数据,从而产生无法重复的读操作,或“影子”数据。比如,事务1读取了一行,事务2修改或者删除这一行并且提交。如果事务1想再一次读取这一行,它将获得修改后的数据或者发现这一样已经被删除,因此事务的第二次读取结果与第一次读取结果不同,因此也叫不可重复读。
实验1
query1:事务1
--step1:创建实验数据 select * into Employee from AdventureWorks.HumanResources.Employee alter table Employee add constraint pk_Employee_EmployeeID primary key(EmployeeID) --step2:设置隔离级别,这是数据库的默认隔离界别 SET TRANSACTION ISOLATION LEVEL READ COMMITTED --step3:开启第一个事务 BEGIN TRAN tran1 --step4:执行select操作,查看VacationHours,对查找的记录加S锁,在语句执行完以后自动释放S锁 SELECT EmployeeID, VacationHours FROM Employee WHERE EmployeeID = 4; --step5:查看当前加锁情况,没有发现在Employee表上面有锁,这是因为当前的隔离界别是READ COMMITTED --在执行完step2以后马上释放了S锁. SELECT request_session_id, resource_type, resource_associated_entity_id, request_status, request_mode, resource_description FROM sys.dm_tran_locks
查看锁的情况如下图所示,我们发现在只有在数据库级别的S锁,而没有在表级别或者更低级别的锁,这是因为在Read Committed级别下,S锁在语句执行完以后就被释放。
query2:事务2
--step6:开启第二个事务 BEGIN TRAN tran2; --step7:修改VacationHours,需要获得排它锁X,在VacationHours上没有有S锁 UPDATE Employee SET VacationHours = VacationHours - 8 WHERE EmployeeID = 4; --step8:查看当前加锁情况 SELECT request_session_id, resource_type, resource_associated_entity_id, request_status, request_mode, resource_description FROM sys.dm_tran_locks
在开启另外一个update事务以后,我们再去查看当前的锁状况,如下图所示,我们发现在表(Object)级别上加了IX锁,在这张表所在的Page上也加了IX锁,因为表加了聚集索引,所以在叶子结点上加了X锁,这个锁的类型是KEY。
然后我们回到事务1当中再次执行查询语句,我们会发现查询被阻塞,我们新建一个查询query3来查看这个时候的锁状况,其查询结果如下,我们可以发现查询操作需要在KEY级别上申请S锁,在Page和表(Object)上面申请IS锁,但是因为Key上面原先有了X锁,与当前读操作申请的S锁冲突,所以这一步处于WAIT状态。
如果此时提交事务2的update操作,那么事务1的select操作不再被阻塞,得到查询结果,但是我们发现此时得到的查询结果与第一次得到的查询结果不同,这也是为什么将read committed称为不可重复读,因为同一个事物内的两次相同的查询操作的结果可能不同。
REPEATABLE READ
REPEATABLE READ是比READ COMMITTED限制性更强的隔离级别。该级别包括READ COMMITTED,并且另外指定了在当前事务提交之前,其他任何事务均不可以修改或删除当前事务已读取的数据。并发性低于 READ COMMITTED,因为已读数据的共享锁在整个事务期间持有,而不是在每个语句结束时释放。比如,事务1读取了一行,事务2想修改或者删除这一行并且提交,但是因为事务1尚未提交,数据行中有事务1的锁,事务2无法进行更新操作,因此事务2阻塞。如果这时候事务1想再一次读取这一行,它读取结果与第一次读取结果相同,因此叫可重复读。
实验2
query1:事务1
--step1:创建实验数据 select * into Employee from AdventureWorks.HumanResources.Employee alter table Employee add constraint pk_Employee_EmployeeID primary key(EmployeeID) --step2:设置隔离级别 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ --step3:开启第一个事务 BEGIN TRAN tran1 --step4:执行select操作,查看VacationHours SELECT EmployeeID, VacationHours FROM Employee WHERE EmployeeID = 4; --step5:查看当前加锁情况,发现在Employee表上面有S锁,这是因为当前的隔离界别是REPEATABLE READ --S锁只有在事务执行完以后才会被释放. SELECT request_session_id, resource_type, resource_associated_entity_id, request_status, request_mode, resource_description FROM sys.dm_tran_locks
查询锁状态的结果如下图所示,我们发现在KEY上面加了S锁,在Page和Object上面加了IS锁,这是因为在Repeatable Read级别下S锁要在事务执行完以后才会被释放。
query2:事务2
--step6:开启第二个事务 BEGIN TRAN tran2; --step7:修改VacationHours,需要获得排他锁X,在VacationHours上有S锁,出现冲突,所以update操作被阻塞 UPDATE Employee SET VacationHours = VacationHours - 8 WHERE EmployeeID = 4;
执行上述update操作的时候发现该操作被阻塞,这是因为update操作要加排它锁X,而因为原先的查询操作的S锁没有释放,所以两者冲突。我们新建一个查询3执行查询锁状态操作,发现结果如下图所示,我们可以发现是WAIT发生在对KEY加X锁的操作上面。
此时再次执行查询1中的select操作,我们发现查询结果跟第一次相同,所以这个叫做可重复读操作。但是可重复读操作并不是特定指两次读取的数据一模一样,Repeatable Read存在的一个问题是幻读,就是第二次读取的数据返回的条目数比第一次返回的条目数更多。
比如在Repeatable Read隔离级别下,事务1第一次执行查询select id from users where id>1 and id <10,返回的结果是2,4,6,8。这个时候事务1没有提交,那么对2,4,6,8上面依然保持有S锁。此时事务2执行一次插入操作insert into user(id) valuse(3),插入成功。此时再次执行事务1中的查询,那么返回结果就是2,3,4,6,8。这里的3就是因为幻读而出现的。因此可以得出结论:REPEATABLE READ隔离级别保证了在相同的查询条件下,同一个事务中的两个查询,第二次读取的内容肯定包换第一次读到的内容。
SERIALIZABLE
SERIALIZABLE 是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。该级别包括REPEATABLE READ,并增加了在事务完成之前,其他事务不能向事务已读取的范围插入新行的限制。比如,事务1读取了一系列满足搜索条件的行。事务2在执行SQL statement产生一行或者多行满足事务1搜索条件的行时会冲突,则事务2回滚。这时事务1再次读取了一系列满足相同搜索条件的行,第二次读取的结果和第一次读取的结果相同。
重复读与幻读
重复读是为了保证在一个事务中,相同查询条件下读取的数据值不发生改变,但是不能保证下次同样条件查询,结果记录数不会增加。
幻读就是为了解决这个问题而存在的,他将这个查询范围都加锁了,所以就不能再往这个范围内插入数据,这就是SERIALIZABLE 隔离级别做的事情。
隔离级别与锁的关系
- 在Read Uncommitted级别下,读操作不加S锁;
- 在Read Committed级别下,读操作需要加S锁,但是在语句执行完以后释放S锁;
- 在Repeatable Read级别下,读操作需要加S锁,但是在事务提交之前并不释放S锁,也就是必须等待事务执行完毕以后才释放S锁。
- 在Serialize级别下,会在Repeatable Read级别的基础上,添加一个范围锁。保证一个事务内的两次查询结果完全一样,而不会出现第一次查询结果是第二次查询结果的子集。
相关推荐
本代码是基于python pytorch环境安装的。 可参考博文进行安装环境运行代码-但需要先自行收集好图片放到对应文件夹下: https://blog.csdn.net/no_work/article/details/139246467 首先是代码的整体介绍 总共是3个py文件,十分的简便 本代码是不含数据集图片的,下载本代码后需要自行搜集图片放到对应的文件夹下即可 需要我们往每个文件夹下搜集来图片放到对应文件夹下,每个对应的文件夹里面也有一张提示图,提示图片放的位置 然后我们需要将搜集来的图片,直接放到对应的文件夹下,就可以对代码进行训练了。 运行01生成txt.py,是将数据集文件夹下的图片路径和对应的标签生成txt格式,划分了训练集和验证集 运行02CNN训练数据集.py,会自动读取txt文本内的内容进行训练,这里是适配了数据集的分类文件夹个数,即使增加了分类文件夹,也不需要修改代码即可训练 训练过程中会有训练进度条,可以查看大概训练的时长,每个epoch训练完后会显示准确率和损失值 训练结束后,会保存log日志,记录每个epoch的准确率和损失值 最后训练的模型会保
xgame-code_server,是一个基于 Java 13 实现的游戏服务器框架。
PID控制仿真程序:Excel操作,可视化曲线展示,性能优化与模型源码可修改,适用于PID调参练习和系统仿真模拟等多功能工具,内含加热器与调压阀模型。,PID控制仿真程序。 EXCEL写的,简单易上手,改变绿色参数格即可在图中显示控制曲线,过冲和稳定性能指标等等。 自动绘制阶跃响应和干扰响应图。 使用solver规划模块可针对特定指标进行优化。 开放源文件,模型源码可自己修改。 适合练习PID调参,代替实机实验,方案模拟,系统仿真等等。 目前有两个控制模型:加热器和调压阀。 ,PID控制仿真程序; 绿色参数格; 控制曲线; 过冲; 稳定性能指标; 阶跃响应图; 干扰响应图; Solver规划模块; 模型源码修改; 加热器模型; 调压阀模型,基于Excel的PID控制仿真程序:简单易用,模型优化与仿真工具
三菱Q系列PLC之高效全能程序设计——包含复杂轴操作、模块齐全的精准框架及电路图说明,三菱Q系列plc,11轴标准程序,包含轴回零,相对定位,绝对定位,程序有两轴直线插补,一共有五组插补,整个程序的模块都有,程序框架符合广大编程人员思维,只要弄明白这个程序,一般的项目都不会无从下手,参照这个,做项目不再难,拿着就可用,思路清晰易懂,有触摸屏与电路图。 ,三菱Q系列PLC; 11轴标准程序; 轴回零; 相对定位; 绝对定位; 两轴直线插补; 五组插补; 程序框架; 编程思维; 触摸屏; 电路图。,三菱Q系列PLC全能程序:轴回零至插补一体化的高效框架指南
基于Matlab GUI界面的车道线识别与预测系统:数字图像处理技术的简单应用,- 标题: 基于Matlab的车道线识别系统 - 关键词:matlab GUI界面 车道线识别 数字图像处理 - 步骤:选择视频 需要区域提取 滤波去噪 阈值分割 边缘检测 霍夫直线检测 车道线直线筛选 通过历史车道线预测当前车道线 - 简述:使用数字图像处理技术检测并分割出车道线,并使用历史车道线预测车道线,并与当前检测出的车道线进行比较匹配,输出平均车道线。 效果明显操作简单。 ,核心关键词:Matlab GUI界面; 车道线识别; 数字图像处理; 视频选择; 区域提取; 滤波去噪; 阈值分割; 边缘检测; 霍夫直线检测; 车道线直线筛选; 历史车道线预测; 平均车道线。,基于Matlab GUI的智能车道线识别系统:数字图像处理与预测算法的融合
本代码是基于python pytorch环境安装的。 可参考博文进行安装环境运行代码-但需要先自行收集好图片放到对应文件夹下: https://blog.csdn.net/no_work/article/details/139246467 首先是代码的整体介绍 总共是3个py文件,十分的简便 本代码是不含数据集图片的,下载本代码后需要自行搜集图片放到对应的文件夹下即可 需要我们往每个文件夹下搜集来图片放到对应文件夹下,每个对应的文件夹里面也有一张提示图,提示图片放的位置 然后我们需要将搜集来的图片,直接放到对应的文件夹下,就可以对代码进行训练了。 运行01生成txt.py,是将数据集文件夹下的图片路径和对应的标签生成txt格式,划分了训练集和验证集 运行02CNN训练数据集.py,会自动读取txt文本内的内容进行训练,这里是适配了数据集的分类文件夹个数,即使增加了分类文件夹,也不需要修改代码即可训练 训练过程中会有训练进度条,可以查看大概训练的时长,每个epoch训练完后会显示准确率和损失值 训练结束后,会保存log日志,记录每个epoch的准确率和损失值 最后训练的模型会保
基于C#的WPF智慧工厂数据平台开发:统计图表绘制、页面设计、动画展现与数据库管理,C#两套WPF,看板和WPF工业组件 WPF智慧工厂数据平台 1, 提供一个智慧工厂数据平台框架。 2,理解wpf的设计模式。 3,学习如何绘制各种统计图。 4,设计页面板块划分。 5,如何在适当时候展现动画。 6,wpf工业组件 7, 工业mes基础开发 8, wpf建立数据库 9, 建立和plc编程 6,提供纯源代码 有盆友问,这个是否带数据库,其实这个不是重点, 重点是页面展示。 数据库嘛,安装一个,连接上就可以了。 技术无止境。 ,核心关键词:WPF;两套WPF;看板;智慧工厂数据平台;WPF工业组件;设计模式;统计图;页面板块划分;动画展示;工业mes基础开发;数据库建立;PLC编程;纯源代码。,基于C# WPF的智慧工厂数据平台:设计与实现统计图展示与工业组件集成
S7-200 PLC与组态王联合打造水站冷却塔智能控制系统:梯形图程序、接线图及组态画面全解析,S7-200 PLC和组态王组态某厂水站冷却塔控制系统 带解释的梯形图程序,接线图原理图图纸,io分配,组态画面 ,S7-200 PLC; 组态王组态; 冷却塔控制系统; 梯形图程序; 接线图原理图; IO分配; 组态画面,"S7-200 PLC与组态王联合构建水站冷却塔控制系统"
摄影师社区系统 免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1jKDjYrEz1 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
微波工程(第三版)-David M Pozar-电子工业出版社-附作者手写习题答案
allWebPlugin中间件-春节版-V2.0.30.0.zip
e42aa0f4d1f3142b453179483bb1d3f4.part4
三菱Q系列PLC 11轴标准程序:涵盖轴回零、定位及五组插补功能,搭配触摸屏与电路图,通用易懂的项目参考框架。,三菱Q系列plc,11轴标准程序,包含轴回零,相对定位,绝对定位,程序有两轴直线插补,一共有五组插补,整个程序的模块都有,程序框架符合广大编程人员思维,只要弄明白这个程序,一般的项目都不会无从下手,参照这个,做项目不再难,拿着就可用,思路清晰易懂,有触摸屏与电路图。 ,核心关键词:三菱Q系列PLC; 11轴标准程序; 轴回零; 相对定位; 绝对定位; 两轴直线插补; 五组插补; 程序框架; 编程人员思维; 触摸屏; 电路图。,三菱Q系列PLC 11轴程序框架详解:轴定位、插补及界面一体化设计
"揭秘1.5MW无刷双馈电机性能与波形:定子转子细节解析",1.5MW无刷双馈电机性能及波形 包含正常运行的各种波形,定子匝间以及转子匝间波形 ,1.5MW无刷双馈电机性能;定子转子匝间波形;正常运行波形,"无刷双馈电机性能详解:1.5MW运行波形与定转子匝间波形分析"
数字科技风险报告管理系统 免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1jKDjYrEz1 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
BLDC无刷直流电机与PMSM永磁同步电机的传感器与无传感器驱动方案详解:基于stm32F1的学习参考程序与原理图,BLDC无刷直流电机和PMSM永磁同步电机 有传感器 和无传感器驱动方案 BLDC无刷直流电机和PMSM永磁同步电机 基于stm32F1的有传感器和无传感驱动 直流无刷电机有传感器和无传感驱动程序, 无传感的实现是基于反电动势过零点实现的,有传感是霍尔实现。 永磁同步电机有感无感程序,有感为霍尔FOC和编码器方式, 无感为滑模观测器方式。 有原理图和文档 可供学习参考 程序有详细注释 ,BLDC无刷直流电机; PMSM永磁同步电机; 有传感器驱动; 无传感器驱动; STM32F1; 反电动势过零点; 霍尔传感器; 霍尔FOC; 编码器; 滑模观测器; 原理图; 文档; 程序注释,"无刷直流电机与永磁同步电机:有感无感驱动方案及STM32F1实现"
"深入解析两相步进EtherCAT源码:高性能步进方案的研究与学习价值",两相步进EtherCAT源码,步进方案,具有很高的研究学习价值 ,核心关键词:两相步进EtherCAT源码; 步进方案; 研究学习价值; 高价值技术。,"EtherCAT驱动下的两相步进控制源码及其高价值研究学习方案"
原厂高频注入与增强型滑模观测器:完整工程源码解析与注释,可编译下载,原厂 高频注入与增强型滑模观测器 带解析文档 完整工程源码 HFI与ESMO 完整工程源码 可编译,带详细注释 ,核心关键词:原厂高频注入; 增强型滑模观测器; HFI与ESMO完整工程源码; 解析文档; 完整工程源码带详细注释; 可编译。,高频注入与滑模观测器:原厂增强版完整工程源码及解析文档
Smart 200PLC与ACS580变频器RTU通讯设置详解:包括设置指南与SMART 700IE V3触摸屏编程指导,Smart 200PLC与ACS580-880MODBUS RTU通讯,包涵变频器设置说明,变频器说明书,SMART 700IE V3触摸屏程序。 ,关键词:Smart 200PLC; ACS580-880 MODBUS RTU通讯; 变频器设置说明; 变频器说明书; SMART 700IE V3触摸屏程序; 通讯协议; 程序编写; 设置方法。,基于Smart PLC与ACS580变频器通讯的MODBUS RTU设置与操作指南(含触摸屏程序)
WCA-BP神经网络优化算法回归预测MATLAB代码详解:电厂数据预测(附优化前后对比),WCA水循环算法优化BP神经网络(WCA-BPNN)回归预测MATLAB代码(有优化前后的对比) 代码注释清楚。 main为运行主程序,可以读取本地EXCEL数据。 很方便,容易上手。 (以电厂运行数据为例) 温馨提示:联系请考虑是否需要,程序代码,一经出,概不 。 ,WCA-BPNN; 回归预测; MATLAB代码; 优化前后对比; 代码注释; 主程序; EXCEL数据读取; 电厂运行数据。,"WCA-BPNN优化BP神经网络回归预测MATLAB代码(含前后对比及注释)"