SqlServer中的事务隔离级别、锁机制
事务
作用:用来执行一连串的动作,并且保证所有动作要么都执行、要么都不执行。
属性:原子行、一致性、隔离性、持久性
锁
作用:SqlServer使用锁来实施事务隔离属性。
阻塞
定义:如果一个事务持有一数据资源的锁,而另一事务请求相同资源的不兼容的锁,则新锁的请求将被阻塞。
默认情况下,被阻塞的请求会一直等待,直到原来的事务释放相关的锁。
事务的隔离级别
可设置的有6个(从上往下 隔离级别越来越高):
1、read uncommitted
2、read committed
3、repeatable read
4、serializable
5、snapshot
6、read committed snapshot
其中前面四个级别最常用
1、read uncommitted 脏读
例如A某正在执行如下语句:
begin tran insert tbUnRead select 3,'张三' union select 4,'李四' ---延迟秒,模拟真实交易情形,用于处理业务逻辑 waitfor delay '00:00:05' rollback tran
此时,在等待的5秒内,B某恰好对该资源做了修改:
set Transaction isolation level read uncommitted --查询数据 select * from tbUnRead where name like '张%'
本来A某要插入两条数据,但是最后事务回滚了,此时数据库应该不存在这两条数据,但是B某却读取到了,这就是脏读。
要解决这个问题,就需要将事务隔离级别提升到read committed
2、read committed 不可重复读(避免脏读的最低级别)
假如A某正在执行如下操作:
set Transaction isolation level read committed begin tran select * from tbUnRead where ID=2 ---延迟秒,模拟真实交易情形,用于处理业务逻辑 waitfor delay '00:00:05' select * from tbUnRead where ID=2
此时,在等待的5秒内,B某恰好对该资源做了修改:
update tbUnRead set name='Jack_upd' where ID=2
这样产生的结果是,在同一个事务内,两次条件相同的查询会有不同的结果。
要解决这个问题,就需要将事务隔离级别提升到repeatable read
3、repeatable read 幻读
假如A某在执行如下操作:
set Transaction isolation level REPEATABLE READ begin tran select * from tbUnRead where ID=3 ---延迟秒,模拟真实交易情形,用于处理业务逻辑 waitfor delay '00:00:05' select * from tbUnRead where ID=3 commit tran
此时,在等待的5秒内,B某恰好对该资源做了修改:
INSERT tbUnRead
select 3,'幻读'
此时,A某已经把隔离级别设置为“可重复读”,虽然是曾经读取的数据,不管是共享锁还是互斥锁都 保留到了事务结束,但是无法阻止其他人运行新增操作,导致第一次查询时没有数据,第二次查询时却有了数据,这种现象被称为幻读。
要解决这个问题,就需要将事务隔离级别提升到serializable
最新文章
- Java 基础【07】线程同步锁的选择
- 搭载hexo+github博客系统
- 用nginx做反向代理来访问防外链图片
- hadoop错误org.apache.hadoop.util.DiskChecker$DiskErrorException Could not find any valid local directory for
- SQL Server 表字段值转列名 示例
- 查看Redis信息和状态
- Theano 在windows下安装
- Dagger2学习之由浅入深
- js实现求平均数功能
- 玩转Web之servlet(二)---servlet常见错误
- python使用smtplib库和smtp.qq.com邮件服务器发送邮件(转)
- JavaWeb框架的基石
- Windows 2012建立域控(AD DS)详解
- Java进阶篇设计模式之八 ----- 责任链模式和命令模式
- SpringBoot前后端分离Instant时间戳自定义解析
- iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包
- Error occurred during initialization of VM Could not reserve enough space for object heap
- JavaScript: DOM Docunment
- MySQL误删数据
- Android 发展思路
热门文章
- (NO.00005)iOS实现炸弹人游戏(四):游戏数据的初始化(一)
- (NO.00005)iOS实现炸弹人游戏(一):游戏的整体规划设计
- Android的DatePicker和TimePicker-android学习之旅(三十八)
- JVM的内存区域模型
- OpenCV计算物体的重心坐标(2值图像)
- Android开发技巧——使用PopupWindow实现弹出菜单
- Java-IO之FilterInputStream和FilterOuptStream
- (六十七)Xcode导入XMPPFramework框架
- Cocos2D:塔防游戏制作之旅(十五)
- BAT有增有减&;nbsp;互联网2015校园…