SqlServer中的更新锁(UPDLOCK)

优点: 允许读取数据(不阻塞其它事务)并在以后更新数据,同时确保自从上次读取数据后数据没有被更改

当用UPDLOCK来读取记录时可以对取到的记录加上更新锁,从而加上锁的记录在其它的线程中是不能更改的只能等本线程的事务结束后才能更改

begin tran
select * from address WITH (UPDLOCK) where [Name]=‘Z‘
waitfor delay ‘00:00:10‘
update address set [Name]=‘ZZ‘
commit tran

注意:

在另一个查询里:
如果同样要加更新锁,则会阻塞当前查询,直到其它连接释放更新锁.
如果不加更新锁则直接可以读取更新锁的记录.

这样做是对当前行的锁定,而不是整个表

如果对整个表锁定则严重影响了性能

时间: 2024-10-01 20:35:33

SqlServer中的更新锁(UPDLOCK)的相关文章

使用Sqlserver更新锁防止数据脏读

有时候我们需要控制某条记录在程序读取后就不再进行更新,直到事务执行完释放后才可以.这时候我们就可以将所有要操作当前记录的查询加上更新锁,以防止查询后被其它事务修改.这种操作只锁定表中某行而不会锁定整个表,体验更好. 测试sql代码如下: 在一个查询中执行如下语句 begin tran SELECT InvestState FROM InvestOrdersABC WITH (UPDLOCK) where id=10005 waitfor delay '00:00:10' update Inves

sql server中的锁 事务锁 更新锁 保持锁 共享锁 你知道吗?

锁定数据库的一个表 SELECT * FROM table WITH (HOLDLOCK) 注意: 锁定数据库的一个表的区别 SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除 SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除 SELECT 语句中"加锁选项"的功能说明 SQL Server提供了强大而完备的锁机制来帮助实现数据库系统的并发性和高性能.用户既能使用SQL Ser

lock(1)——创建及更新表过程中SQL SERVER锁资源分配情况

锁应该说是由关系型数据库ACID(Atomicity,Consistency,Isolation,Durability)特性而引出的. 以下将测试在创建及更新表过程中SQL Server锁资源分配情况 获取当前会话的事务隔离级别:DBCC USEROPTIONS 测试环境:SQL SERVER 2008 R2 read committed隔离级别下 创建表 当我们只是打开一个SSMS查询窗口,选择数据库为master和tempdb时,没有任何锁产生,当我选择其他数据库,sql server就会在

sqlserver 中死锁相关问题

死锁定义: 所谓死锁就是两个线程或多个线程在拥有一部分资源的同时还需要拥有其他资源, 但是其他资源被其他线程占有,每个线程为了获得其他线程占有的资源都处于一个相互等待 的状态,这个时候如果没有外界力量破坏这种相互等待的状态或是某个(些)线程自动放弃已经占有的资源, 那么所有的线程都无法完成任务,这个时候系统处于一个僵死状态.这就是所谓的死锁. sqlserver自身有个锁监视器(Lock monitor),一旦发现死锁,SqlServer会kill掉一个其中一个线程, 使另外一个(些)继续完成任

【SqlServer】解析SqlServer中的事务

在这篇Blog中,笔者将会解析阐述SqlServer中的事务,希望可以对你有所帮助. 1.事务是什么 事务就是单个逻辑单元执行的一系列操作.事务都具有ACID特性:原子性(Atomicity).一致性(Consistency).隔离性(Isolation)和持久性(Durability). 原子性(Atomicity):事务必须是原子工作单元:对于其数据修改,要么全都执行,要么全都不执行. 一致性(Consistency):事务在完成时,必须使所有的数据都保持一致状态. 在相关数据库中,所有规则

sqlserver中select造成死锁

项目上线,准备验收前出现了一个严重的问题:很多select语句作为死锁的牺牲,大部分报表无法打开.这个问题影响范围很大所有的报表都无法访问,而我们的报表是放在电视上面轮播的,电视放在工厂里面,所以出现问题后,整个工厂都知道了. 解决这个问题比较曲折,首先是写SAP接口的同事发现了问题:SAP一直在传错误数据导致产量表被锁住.修改SAP传输的错误数据后,这个死锁的问题没有出现了.但是我查看生产环境服务器日志的时候,发现这个问题依然存在,由于客户没有提这个问题,我也就是没有理由要求花时间修改了,因为

SQLServer中的死锁的介绍

原文:SQLServer中的死锁的介绍 简介      什么是死锁? 我认为,死锁是由于两个对象在拥有一份资源的情况下申请另一份资源,而另一份资源恰好又是这两对象正持有的,导致两对象无法完成操作,且所持资源无法释放. 什么又是阻塞? 阻塞是由于资源不足引起的排队等待现象.比如同时两个进程去更新一个表. 这里我们可以把阻塞作为死锁的必要条件.下面我们先理解一下死锁和阻塞再来看一下我最近遇到一个问题以及解决思路. SQLServer中的死锁      对应到SQL Server中,当在两个或多个任务

数据库中的 各种锁 详解

1 前言 数据库大并发操作要考虑死锁和锁的性能问题.看到网上大多语焉不详(尤其更新锁),所以这里做个简明解释,为下面描述方便,这里用T1代表一个数据库执行请求,T2代表另一个请求,也可以理解为T1为一个线程,T2 为另一个线程.T3,T4以此类推.下面以SQL Server(2005)为例. 2 锁的种类 共享锁(Shared lock). 例1: ---------------------------------------- T1: select * from table (请想象它需要执行

Sqlserver 笔记 持续更新

1.sp_spaceused : sp_spaceused table_name --------------------------------------------------------------------------------------------- name  rows  reserved  data  index_size  unused table_name 16470592  36315696KB  35796160KB  519432KB  104KB name  -