sqlupdate锁
Ⅰ 为什么我们需要在sql Server里更新锁
首先介绍下当更新锁(Update(U)Lock)获得时,根据它的兼容性锁本身是如何应对的。
一般来说,当执行UPDATE语句时,SQL Server会用到更新锁(Update Lock)。如果查看对应的执行计划,会看到它包含3个部分:
读取数据
计算新值
写入数据
这是其中一个主要原因,为什么关系数据库引擎引入更新锁来实现避免特定的死锁情形。一个更新锁只与一个共享锁兼容,但不与另一个更新或排它锁兼容。因此死锁情形可以被避免,应为2个更新查询计划不可能同时并发运行。在查询的第1阶段,第2个查询会一直等到获得更新锁。System R的一个未公开研究也展示如何避免这类显着的死锁。System R不实用任何更新锁来实现避免死锁。
提升的并发
在第1阶段不获得更新锁,在这个阶段直接获得排它锁也是可见选项。这会克服死锁问题,因为排它锁与另一个排它锁不兼容。但这个方法的问题是并发受限制,因为同时没有其他的SELECT查询可以读取当前有排它锁的数据。因此需要更新锁,因为这个特定锁与传统的共享锁兼容。这样的话其他的SELECT查询可以读取数据,只要这个更新锁还没转化为排它锁。作为副作用,这会提高我们并发运行查询的并发性。
在以前关系学术上,更新锁是所谓的非对称锁(Asymmetric Lock)。在更新锁的上下文里,这个更新锁与共享锁兼容,但反之就不是:共享锁与更新锁不兼容。但SQL Server并不把共享锁作为非对称锁实现。更新锁是个对称(symmetric)的,就是说更新锁和共享锁是彼此双向兼容的。这会提供系统的整体并发,因为在2个锁类型键不会引入阻塞情形。
小结
在今天的文章里你介绍了共享锁,还有为什么需要共享锁在关系数据库,是强烈需要更新锁的,因为不然的就会带来死锁并降低并发。
Ⅱ sql server里update时,是行锁还是表锁问题
我觉得是表锁吧, 那个进程貌似是针对表的。 每次更新超大的表,就经常报错。要是行锁应该不会报错的, 我更新的东西都是以前月份的记录, 不是当前操作的, 我觉得是表锁!
Ⅲ sql server里update时,是行锁还是表锁问题
当然会,select要获得共享锁,update要获得排他锁,排他锁与其他锁都冲突
可以用select * from tb(nolock) 指定查询不占用锁资源,就不会冲突了
Ⅳ 在sql数据库insert,update操作的数据量超过多少会死锁
死锁是操作系统的名词。是指在响应数据库操作时的反应情况。
这个与计算机的配置及环境设置有关。
注意一般的insert不会出问题,因为此语句,只是在数据库的最末写入新纪录。
而update,较之占内存。
Ⅳ sql server update 怎么取消表锁
listViewer.setContentProvider(new IStructuredContentProvider() {
public Object[] getElements(Object inputElement) {
Vector v = (Vector)inputElement;
return v.toArray();
}
Ⅵ mysql update会锁表吗
有一个任务序列控制sql语句的执行,
第一次有select的语句查询表a,mysql服务器在执行select之前将表a加读锁,
第二次又有一条select语句查询表a, mysql服务器发现在任务序列中有表a的读锁,也就是同时还有一个sql查询表a,读锁不会影响这条sql语句,
当有一条update或者insert语句对表a操作时,mysql服务器会对表a加写锁,以此提示之后的对表a操作的sql语句等待写锁解锁后在执行,以免造成写入与读取的混乱
Ⅶ sql server里update时,是行锁还是表锁问题
锁表。
若指定主键,只有一条记录,则锁行。
若不指定,则锁表。
Ⅷ sql server里update时,是行锁还是表锁问题
看表结构,如果没有主键无法只锁定行
如果要验证的话,只需要类似下面的方法就行了:
--开事务,以保持锁
BEGINTRAN
--更新
updatetablea
setcolumn1=1
whereidx=1
--列出锁信息
EXECsp_lock@@spid
--提交或者回滚事务
COMMIT/ROLLBACKTRAN
输出的结果大致是这样:
通过dbid,ObjId可以找到你更新的表相关的锁记录
如果IndId为0,表示锁在表上,否则在对应的索引上
通过Type列,可以确定被锁定的是行/表,或者是其他,并且可以通过Mode看到是什么锁
在Status中,还可以看到锁是已经加上了,还是在等待其他资源释放(以取得加锁的权利)
-------------------------------------------------------------------------
53111151510180TABISGRANT
锁的类型(Tyep列值,RID和KEY的话,表示锁在行上)有如下几种:
RID=表中单个行的锁,由行标识符(RID)标识。
KEY=索引内保护可串行事务中一系列键的锁。
PAG=数据页或索引页的锁。
EXT=对某区的锁。
TAB=整个表(包括所有数据和索引)的锁。
DB=数据库的锁。
FIL=数据库文件的锁。
APP=指定的应用程序资源的锁。
MD=元数据或目录信息的锁。
HBT=堆或B树索引的锁。在SQLServer2005中此信息不完整。
AU=分配单元的锁。在SQLServer2005中此信息不完整。
Ⅸ sql server update会死锁吗
会死锁,当资源被别的几个进程互相占用的时候,就会死锁,举个简单的列子
出现循环等待资源。
当sql发出一个update请求之后,数据库会对表中的每条记录加上U锁。然后数据库会根据where条件,将符合条件的记录转换为X锁。对不满足条件的记录释放U锁。
上面死锁的原因就是更新的时候先要查询相关的记录才能更新,这个时候就有可能会产生死锁。当然还有很多其它的原因也有可能产生死锁。