知方可补不足~Sqlserver中的几把锁和.net中的事务级别 回到目录
当数据表被事务锁定后,我们再进行select查询时,需要为with(锁选项)来查询信息,如果不加,select将会被阻塞,直到锁被释放,下面介绍几种SQL的锁选项
SQL的几把锁
NOLOCK(不加锁)
此选项被选中时,SQL Server 在读取或修改数据时不加任何锁。 在这种情况下,用户有可能读取到未完成事务(Uncommited Transaction)或回滚(Roll Back)中的数据, 即所谓的“脏数据”。
HOLDLOCK(保持锁)
此选项被选中时,SQL Server 会将此共享锁保持至整个事务结束,而不会在途中释放。
UPDLOCK(修改锁)
此选项被选中时,SQL Server 在读取数据时使用修改锁来代替共享锁,并将此锁保持至整个事务或命令结束。使用此选项能够保证多个进程能同时读取数据但只有该进程能修改数据。
TABLOCK(表锁)
此选项被选中时,SQL Server 将在整个表上置共享锁直至该命令结束。 这个选项保证其他进程只能读取而不能修改数据。
PAGLOCK(页锁)
此选项为默认选项, 当被选中时,SQL Server 使用共享页锁。
TABLOCKX(排它表锁)
此选项被选中时,SQL Server 将在整个表上置排它锁直至该命令或事务结束。这将防止其他进程读取或修改表中的数据。
下面看一下.net frameworks平台关于事务级别的枚举,它对应于sql的事件级别
复制代码
namespace System.Transactions
{
// 摘要:
// Specifies the isolation level of a transaction.
public enum IsolationLevel
{
// 摘要:序列化隔离级别,约束力最高,在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。
// 这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。
// Volatile data can be read but not modified, and no new data can be added
// during the transaction.
Serializable = 0,
//
// 摘要:可重复读的隔离级别,可能出现幻读,锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,
// 且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。
// Volatile data can be read but not modified during the transaction.New data
// can be added during the transaction.
RepeatableRead = 1,
//
// 摘要:不能读但可修改,可能出现不可重复读,指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,
// 从而产生不可重复读取或幻像数据。该选项是 SQL Server 的默认值。
// Volatile data cannot be read during the transaction, but can be modified.
ReadCommitted = 2,
//
// 摘要:可以读也可以修改,可能出现脏数据,执行脏读或 0 级隔离锁定,这表示不发出共享锁,也不接受排它锁。
// 当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据集消失。这是四个隔离级别中限制最小的级别。
// Volatile data can be read and modified during the transaction.
ReadUncommitted = 3,
//
// 摘要:忽略数据的修改,得到修改前的数据
// Volatile data can be read.Before a transaction modifies data, it verifies
// if another transaction has changed the data after it was initially read.If
// the data has been updated, an error is raised.This allows a transaction to
// get to the previously committed value of the data.
Snapshot = 4,
//
// 摘要:
// The pending changes from more highly isolated transactions cannot be overwritten.
Chaos = 5,
//
// 摘要:
// A different isolation level than the one specified is being used, but the
// level cannot be determined.An exception is thrown if this value is set.
Unspecified = 6,
}
}
复制代码
对于事务级别的总结
下面是在嵌套事务中经常遇到的情况
1 脏读:一个事务会读进还没有被另一个事务提交的数据,所以你会看到一些最后被另一个事务回滚掉的数据。
2 读值不可复现:一个事务读进一条记录,另一个事务更改了这条记录并提交完毕,这时候第一个事务再次读这条记录时,它已经改变了。
3 幻影读:一个事务用select子句来检索一个表的数据,另一个事务insert一条新的记录,并且符合select条件,这样,第一个事务用同一个select条件来检索数据后,就会多出一条记录。
下面是IsolationLevel级别在使用过程中的一些说明(来自博文:http://www.cnblogs.com/CN5135/archive/2011/10/24/2222350.html)
ReadCommitted:
假设A事务对正在读取数据Data放置了共享锁,那么Data不能被其它事务改写,所以当B事务对Data进行读取时总和A读取的Data数据是一致的,所以避免了脏读。由于在A没有提交之前可以对Data进行改写,那么B读取到的某个值可能会在其读取后被A更改从而导致了该值不能被重复取得;或者当B再次用相同的where字句时得到了和前一次不一样数据的结果集,也就是幻像数据。
ReadUncommitted:
假设A事务即不发布共享锁,也不接受独占锁,那么并发的B或者其它事务可以改写A事务读取的数据,那么并发的C事务读取到的数据的状态和A的或者B的数据都可能不一致,那么。脏读、不可重复读、幻象数据都可能存在。
RepeatableRead:
(注意MSDN原文中的第一句话:在查询中使用的所有数据上放置锁,所以不存在脏读的情况)。
假设A事务对读取的所有数据Data放置了锁,以阻止其它事务对Data的更改,在A没有提交之前,新的并发事务读取到的数据如果存在于Data中,那么该数据的状态和A事务中的数据是一致的,从而避免了不可重复的读取。但在A事务没有结束之前,B事务可以插入新记录到Data所在的表中,那么其它事务再次用相同的where字句查询时,得到的结果数可能上一次的不一致,也就是幻像数据。
Serializable:
在数据表上放置了排他锁,以防止在事务完成之前由其他用户更新行或向数据集中插入行,这是最严格的锁。它防止了脏读、不可重复读取和幻象数据。
它的对应表如下:
隔离级别
脏读(Dirty Read)
不可重复读(NonRepeatable Read)
幻读(Phantom Read)
读未提交(Read uncommitted)
可能
可能
可能
读已提交(Read committed)
不可能
可能
可能
可重复读(Repeatable read)
不可能
不可能
可能
可串行化(Serializable )
不可能
不可能
不可能
回到目录
知方可补不足~Sqlserver中的几把锁和.net中的事务级别 回到目录的更多相关文章
- 知方可补不足~Sqlserver发布订阅与sql事务的关系
回到目录 前几讲说了一下通过sqlserver的发布与订阅来实现数据的同步,再通过EF这个ORM架构最终实现架构系统的读写分离,而在使用发布与订阅来实现数据同步时,需要我们注意几点,那就是当操作被使用 ...
- 知方可补不足~sqlserver中触发器的使用
回到目录 触发器在过去的10年中,即存储过程和ado.net称霸江湖期间是那么的重要,而现在,trigger显得不是那么必要的,我们很少将复杂的业务写在SQL里,当然也会没有机会写到trigger里了 ...
- 知方可补不足~sqlserver中使用sp_who查看sql的进程
回到目录 在SQLSERVER中每个会话,即每个查询分析器窗口都会产生一个SQL进程,对于那些持续时间短的进程,它们转瞬即失,而对于持续时间比较长的,我们需要希望查看它的运行状态,就可以借助SQL提供 ...
- 知方可补不足~Sqlserver中的几把锁和.net中的事务级别
回到目录 当数据表被事务锁定后,我们再进行select查询时,需要为with(锁选项)来查询信息,如果不加,select将会被阻塞,直到锁被释放,下面介绍几种SQL的锁选项 SQL的几把锁 NOLOC ...
- 知方可补不足~SqlServer自动备份数据库及清理备份文件
回到目录 对于SQLSERVER这个关系型数据库来说,为了保持数据的安全,备份是必须的,当你的一个误操作导致数据丢失,这可能是灾难性的,是不被允许发生的,这时,我们必须要做好定期的备份工作,如我们可以 ...
- 知方可补不足~SqlServer连接的复用MultipleActiveResultSets
回到目录 MultipleActiveResultSets可以使数据库连接复用,但当你上了moebius这种集群工具后,这个选项不能开启(默认是false),当你使用EF等ORM工具时,这个选项会默认 ...
- 知方可补不足~用SqlProfiler来监视数据库死锁
回到目录 关于锁的相关知识,大家可以看我的这篇文章<知方可补不足~Sqlserver中的几把锁和.net中的事务级别> 死锁我想大家都知道,当一个对话(线程)占用一个资源时,别一个线程也同 ...
- 知方可补不足~sqlserver中的几把锁~续
回到目录 之前写过相关的文章,对脏读,不可重复读,幻读都做了相当的研究,而今天在程序中又出现了这个问题,即当一条数据被update时,另一个线程同时发起了读的操作,这对于序列化级别的事务是不被允许的, ...
- 知方可补不足~sqlserver中对xml类型字段的操作
回到目录 在sqlserver中有很多种数据类型,而XML数据类型是比较新奇怪的一种格式,我们平常接触的可能比较少,用的也少,而在某些场合,使用XML类型可能会使我们的开发变简单,下面就是一种情况: ...
随机推荐
- mysql用触发器同步表
一.先复制表 : and DATE = '2016-09-26' or DATE = '2016-09-27'; 二.创建插入数据时的[触发器] [在phpmyadmin 运行时记得要修改语句定界符 ...
- 3.JMeter添加集合点
1.JMeter的集合点是通过添加定时器来完成的,在做性能测试时,真正的并发是不可能的,为了更真实的模拟并发场景,因此在需要压测的地方设置集合点,即可一起操作发送请求. 2.JMeter添加定时器,右 ...
- RK3288 查看时钟树
主控端可以通过指令查看时钟树,enable_cnt为1,表示时钟已使能. # cat d/clk/clk_summary cat d/clk/clk_summary clock enable_cnt ...
- 函数参数个数不确定时使用va_start
今天在网上看程序时忽然发现别人的函数参数中有省略号,甚是吃惊,发现其函数中使用了va_start,经过查资料大概明白其用法,个人觉得很好用! #include <stdio.h> #inc ...
- python2.7 + ubuntu14.4 + dlib19.7
0.首先需要Cmake以及编译C++成python程序的工具 sudo apt-get install libboost-python-dev cmake 1.download dlib19.7 fr ...
- python 面向对象(类的特殊成员)
python 面向对象: (思维导图 ↑↑↑↑) 类的特殊成员 python的类成员存在着一些具有特殊含义的成员 1.__init__: 类名() 自动执行 __init__ class Foo(ob ...
- python list 列表
1. 什么是列表 列表是一个可变的数据类型 列表由[]来表示, 每一项元素使用逗号隔开. 列表什么都能装. 能装对象的对象. 列表可以装大量的数据 2. 列表的索引和切片 列表和字符串一样. 也有索引 ...
- python接口自动化19-requests-toolbelt处理multipart/form-data
requests-toolbelt 1.官方文档地址:requests-toolbelt官方文档 2.环境安装 pip install requests-toolbelt multipart/form ...
- POJ 3684 Physics Experiment(弹性碰撞)
Physics Experiment Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2936 Accepted: 104 ...
- [Java][Web]Web 工程中的各类地址的写法
// 1. request.getRequestDispatcher("/index.html").forward(request,response); // 以 / 开头,对于浏 ...