当前位置:首页 » 编程语言 » sql更新锁
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql更新锁

发布时间: 2022-09-04 18:27:01

sql server 2008 怎样添加更新锁

UPDLOCK.UPDLOCK 的优点是允许您读取数据(不阻塞其它事务)并在以后更新数据,同时确保自从上次读取数据后数据没有被更改。
当我们用UPDLOCK来读取记录时可以对取到的记录加上更新锁,从而加上锁的记录在其它的线程中是不能更改的只能等本线程的事务结束后才能更改.

② SQL server 2008 查询时锁定表,更新后解锁表,如何操作

查看被锁表:select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT' spid 锁表进程 tableName 被锁表名 解锁: declare @spid int Set @spid = 57 --锁表进程declare @sql varchar(1000)set @sql='kill '+cast(@spid as varchar)exec(@sql)

③ sql server在高并发状态下同时执行查询与更新操作时发生死锁怎么办

sql server在高并发状态下同时执行查询与更新操作时发生死锁怎么办
DECLARE @spid INT
DECLARE @blk INT
DECLARE @count INT
DECLARE @index INT
DECLARE @lock TINYINT

SET @lock=0

CREATE TABLE #temp_who_lock
(
id INT IDENTITY(1, 1),
spid INT,
blk INT
)

--if @@error<>0 return @@error
INSERT INTO #temp_who_lock
(spid,
blk)
SELECT 0,
blocked
FROM (SELECT *
FROM master..sysprocesses
WHERE blocked > 0)a
WHERE NOT EXISTS(SELECT *
FROM master..sysprocesses
WHERE a.blocked = spid
AND blocked > 0)
UNION
SELECT spid,
blocked
FROM master..sysprocesses
WHERE blocked > 0

--if @@error<>0 return @@error
SELECT @count = Count(*),
@index = 1
FROM #temp_who_lock

--select @count,@index

--if @@error<>0 return @@error
IF @count = 0
BEGIN
SELECT '没有阻塞和死锁信息'
--return 0
END

WHILE @index <= @count
BEGIN
IF EXISTS(SELECT 1
FROM #temp_who_lock a
WHERE id > @index
AND EXISTS(SELECT 1
FROM #temp_who_lock
WHERE id <= @index
AND a.blk = spid))
BEGIN
SET @lock=1

SELECT @spid = spid,
@blk = blk
FROM #temp_who_lock
WHERE id = @index

SELECT '引起数据库死锁的是: ' + Cast(@spid AS VARCHAR(10)) + '进程号,其执行的SQL语法如下' ;

SELECT @spid,
@blk

DBCC inputbuffer(@spid)

DBCC inputbuffer(@blk)
END

SET @index=@index + 1
END

IF @lock = 0
BEGIN
SET @index=1

WHILE @index <= @count
BEGIN
SELECT @spid = spid,
@blk = blk
FROM #temp_who_lock
WHERE id = @index

IF @spid = 0
SELECT '引起阻塞的是:' + Cast(@blk AS VARCHAR(10)) + '进程号,其执行的SQL语法如下'
ELSE
SELECT '进程号SPID:' + Cast(@spid AS VARCHAR(10)) + '被' + '进程号SPID:' + Cast(@blk AS VARCHAR(10)) + '阻塞,其当前进程执行的SQL语法如下'

PRINT ( LTRIM(@spid) + ''+ LTRIM(@blk));
if(@spid <> 0)
BEGIN
DBCC inputbuffer(@spid) --
END

DBCC inputbuffer(@blk) --引起阻塞语句

SET @index=@index + 1
END
END

DROP TABLE #temp_who_lock

--return 0
--KILL 54

④ sql server update会死锁吗

会死锁,当资源被别的几个进程互相占用的时候,就会死锁,举个简单的列子
出现循环等待资源。
当sql发出一个update请求之后,数据库会对表中的每条记录加上U锁。然后数据库会根据where条件,将符合条件的记录转换为X锁。对不满足条件的记录释放U锁。
上面死锁的原因就是更新的时候先要查询相关的记录才能更新,这个时候就有可能会产生死锁。当然还有很多其它的原因也有可能产生死锁。

⑤ 为什么我们需要在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语句锁定而不让别人同时更新 请知道的说下。 谢谢了

你更新的时候,你更新的数据上本身就加了排他锁的,在你更新的这段时间其他人无法再修改数据。或者还有别的操作后再释放这些数据的话可以用事务。

⑦ sql锁表 分为几种

1. 从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁

MS-SQL Server 使用以下资源锁模式。

锁模式 描述

共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。

更新 (U) 用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。

排它 (X) 用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。

意向锁 用于建立锁的层次结构。意向锁的类型为:意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。

架构锁 在执行依赖于表架构的操作时使用。架构锁的类型为:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。

大容量更新 (BU) 向表中大容量复制数据并指定了 TABLOCK 提示时使用。

◆共享锁

共享 (S) 锁允许并发事务读取 (SELECT) 一个资源。资源上存在共享 (S) 锁时,任何其它事务都不能修改数据。一旦已经读取数据,便立即释放资源上的共享 (S) 锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享 (S) 锁。

◆更新锁

更新 (U) 锁可以防止通常形式的死锁。一般更新模式由一个事务组成,此事务读取记录,获取资源(页或行)的共享 (S) 锁,然后修改行,此操作要求锁转换为排它 (X) 锁。如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排它 (X) 锁。共享模式到排它锁的转换必须等待一段时间,因为一个事务的排它锁与其它事务的共享模式锁不兼容;发生锁等待。第二个事务试图获取排它 (X) 锁以进行更新。由于两个事务都要转换为排它 (X) 锁,并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。

若要避免这种潜在的死锁问题,请使用更新 (U) 锁。一次只有一个事务可以获得资源的更新 (U) 锁。如果事务修改资源,则更新 (U) 锁转换为排它 (X) 锁。否则,锁转换为共享锁。

◆排它锁

排它 (X) 锁可以防止并发事务对资源进行访问。其它事务不能读取或修改排它 (X) 锁锁定的数据。

⑧ SQL SERVER 数据是不是查询时用数据锁那更新(update)可以带锁吗

处理多用户并发访问的方法是加锁。锁是防止其他事务访问指定的资源控制、实现并发控制的一种主要手段。行是可以锁定的最小空间, 行级锁占用的数据资源最少,所以在事务的处理过程中,允许其他事务继续操纵同一个表或者同一个页的其他数据,大大降低了其他事务等待处理的时间,提高了系统的并发性。为了使锁定的成本减至最少,SQL Server 自动将资源锁定在适合任务的级别。锁定在较小的粒度(例如行)可以增加并发但需要较大的开销,因为如果锁定了许多行,则需要控制更多的锁。

行级锁是一种最优锁,因为行级锁不可能出现数据既被占用又没有使用的浪费现象。但是,如果用户事务中频繁对某个表中的多条记录操作,将导致对该表的许多记录行都加上了行级锁,数据库系统中锁的数目会急剧增加,这样就加重了系统负荷,影响系统性能。因此,在SQL Server中,还支持锁升级(lock escalation)。所谓锁升级是指调整锁的粒度,将多个低粒度的锁替换成少数的更高粒度的锁,以此来降低系统负荷。在SQL Server中当一个事务中的锁较多,达到锁升级门限时,系统自动将行级锁和页面锁升级为表级锁。特别值得注意的是,在SQL Server中,锁的升级门限以及锁升级是由系统自动来确定的,不需要用户设置。

网上找的,不知道能不能帮到你。原文的链接是:http://soft.zdnet.com.cn/techupdate/2007/0824/467522.shtml

⑨ MSSQl数据库 加锁 解锁 多客户端同时更新一条数据防止数据出问题

select * from proct where key='xxx' for update
1.setAutoCommit(false) 不要使用自动提交
2.在你修改某条之前执行这一句话
3.修改
4.commit 提交
原则:
用主键查找,否则会把整张表给锁起来,如果有人要修改别的记录也修改不了了

⑩ sql server里update时,是行锁还是表锁问题

-- 开事务, 以保持锁
BEGIN TRAN
-- 更新
update table a
set column1 = 1
where idx = 1
-- 列出锁信息
EXEC sp_lock @@spid
-- 提交或者回滚事务
COMMIT/ROLLBACK TRAN