SQL Server事务的隔离级别
SQL Server事务的隔离级别
########## 数据库中数据的一致性 ##########
针对并发事务出现的数据不一致性,提出了4个级别的解决方法:
隔离级别 | 第一类丢失更新 | 脏读 | 不可重复读 | 第二类丢失更新 | 虚读 |
未提交读 | 未发生 | 发生 | 发生 | 发生 | 发生 |
提交读 | 未发生 | 未发生 | 发生 | 发生 | 发生 |
可重复读 | 未发生 | 未发生 | 未发生 | 未发生 | 发生 |
串行化 | 未发生 | 未发生 | 未发生 | 未发生 | 未发生 |
1.未提交读
采用排它锁(update, insert, delete),解决了丢失更新问题,但是脏读仍然会出现。
例1:
begin tran
update t1 set t1.name = 'yyy'
waitfor delay '00:00:10' --等待10秒
rollback tran
例2:
set transaction isolation level read uncommitted
begin tran
select * from t1
commit tran
结果:例2返回更新后的值(yyy),尽管最后更新回滚了。
2.提交读
采用共享锁(select)+排它锁(update, insert, delete),解决了丢失更新问题,也解决了脏读问题。SQL Server默认属于这个隔离级别。
3.可重复读
采用修改锁(update)+排它锁(insert, delete)+共享锁(select),解决了丢失更新问题,脏读问题,但是会出现幻像读。
例3:
set transaction isolation level repeatable read
begin tran
select * from t1
waitfor delay '00:00:10'
select * from t1
commit tran
例4:
set transaction isolation level repeatable read
begin tran
delete from t1 where t1.id = 8
commit tran
结果:例3,2次返回的结果集都一样,都含有t1.id=8的行。
4.可串行读
采用一个事务执行完后,才能执行第2个事务(被阻塞)的串行方式,解决了以上所有的问题。
例5:
set transaction isolation level serializable
begin tran
select * from t1
waitfor delay '00:00:10'
commit tran
例6:
set transaction isolation level serializable
begin tran
delete from t1 where t1.id = 9
commit tran
结果:例5,2次都返回一样的结果,是删除前的。只能说明实现了可重复读级别的事务。
例7:
set transaction isolation level serializable
begin tran
select * from t1
waitfor delay '00:00:10'
select * from t1
commit tran
例8:
set transaction isolation level serializable
begin tran
insert into t1(name) values('zhang')
commit tran
结果:例7,2次都返回一样的结果,都是添加前的结果集。结合前面的例子说明是串行级别。
最新文章
- D3D三层Texture纹理经像素着色器实现渲染YUV420P
- 以self-contained方式在Linux上部署ASP.NET Core站点
- 更新整理本人所有博文中提供的代码与工具(Java,2013.10)
- php并发编程相关扩展
- MVC:Control与View传值
- javaWeb中servlet开发(2)——servlet与表单
- js模拟触发事件
- 设计模式之Memento(备忘机制)
- 使用SevenZipSharp出现“Can not load 7-zip library or internal COM error! Message: DLL file does not exist.”的解决方案
- solr6.3 + Hbase Indexer使用MR创建索引,错误Bad return type
- mysql排序
- Hadoop组件
- wait(), notify(), notifyAll()等方法介绍
- sqoop上传数据到hdfs,并用hive管理数据。
- .1-浅析express源码之入口文件
- Js利用Canvas实现图片压缩
- mysql编写存储过程(2)
- ubuntu16.04下caffe以cpu运行faster rcnn demo
- 【HDU】2191 多重背包问题
- jQuery中获取相对文档的坐标的方法是什么?
热门文章
- 【OpenStack】OpenStack系列1之OpenStack本地开发环境搭建&;&;向社区贡献代码
- git无法clone远程代码库及git代理设置
- 关于https和数字证书的一些必须知识
- web开发中目录路径问题的解决
- POJ 3904 Sky Code (容斥原理)
- Android Design 4.4中文版发布
- Redhat修改主机名_Red hat怎么永久修改主机名hostname(转)
- 查看LINUX当前负载
- /bin/dd if=/path/to/source-file of=/path/to/backup-file
- Web性能测试中的几个关键指标