锁表 存储过程 游标

本文介绍了SQL Server中如何通过`WITH`关键字进行锁表操作,如`HOLDLOCK`、`NOLOCK`、`UPDLOCK`等,以及它们在不同事务隔离级别下的作用。此外,还讲解了存储过程中的游标使用,包括如何声明、打开、关闭和删除游标,以及在存储过程中更新数据的例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可以用select来锁定整张表,那别人就不可能更新或是读取表的记录。
 
select * from dbo.Employee with(holdlock); with关键字来设置锁表的方式。下面是with括号内关键字的书名: 

NOLOCK(不加锁)

此选项被选中时,SQL Server 在读取或修改数据时不加任何锁。 在这种情况下,用户有可能读取到未完成事务(Uncommited Transaction)或回滚(Roll Back)

中的数据, 即所谓的“脏数据”。
 
HOLDLOCK(保持锁)

此选项被选中时,SQL Server 会将此共享锁保持至整个事务结束,而不会在途中释放。
 
UPDLOCK(修改锁)

此选项被选中时,SQL Server 在读取数据时使用修改锁来代替共享锁,并将此锁保持至整个事务或命令结束。使用此选项能够保证多个进程能同时读取数

据但只有该进程能修改数据。
 
TABLOCK(表锁)

此选项被选中时,SQL Server 将在整个表上置共享锁直至该命令结束。 这个选项保证其他进程只能读取而不能修改数据。
 
PAGLOCK(页锁)

此选项为默认选项, 当被选中时,SQL Server 使用共享页锁。
 
TABLOCKX(排它表锁)

此选项被选中时,SQL Server 将在整个表上置排它锁直至该命令或事务结束。这将防止其他进程读取或修改表中的数据。
 
HOLDLOCK 持有共享锁,直到整个事务完成,应该在被锁对象不需要时立即释放,等于SERIALIZABLE事务隔离级别

NOLOCK 语句执行时不发出共享锁,允许脏读 ,等于 READ UNCOMMITTED事务隔离级别

PAGLOCK 在使用一个表锁的地方用多个页锁

READPAST 让sql server跳过任何锁定行,执行事务,适用于READ UNCOMMITTED事务隔离级别只跳过RID锁,不跳过页,区域和表锁

ROWLOCK 强制使用行锁

TABLOCKX 强制使用独占表级锁,这个锁在事务期间阻止任何其他事务使用这个表

UPLOCK 强制在读表时使用更新而不用共享锁 。
呵呵,上面的够研究一会的了,我常用的就是holdlock和tablockx,holdlock是锁定一张表,但是别的事物还是可以读取的,但不能更新和插入。对于

tabllockx,在事物未提交前,连读取都是阻塞的,直到另一事物提交后才可以读取,这样就保证了数据的一致性。不过锁表需要包含在事物内,否则锁表

是不起作用的。附件当中有示例可以下载。
 

-->CREATE PROCEDURE PK_Test AS
//声明2个变量 declare @O_ID nvarchar(20) declare @A_Salary float
//声明一个游标mycursor,select语句中参数的个数必须要和从游标取出的变量名相同
declare mycursor cursor for select O_ID,A_Salary from AddSalary
//打开游标 open mycursor
//从游标里取出数据赋值到我们刚才声明的2个变量中 fetch next from mycursor into @O_ID,@A_Salary
//判断游标的状态
//0 fetch语句成功
//-1 fetch语句失败或此行不在结果集中
//-2被提取的行不存在
while (@@fetch_status=0)
begin //显示出我们每次用游标取出的值 print '游标成功取出一条数据'
 print @O_ID print @A_Salary
 //用游标去取下一条记录
 fetch next from mycursor into @O_ID,@A_Salary end
//关闭游标 close mycursor //撤销游标 deallocate mycursor GO
-------------------创建游标

Declare mycursor cursor for SELECT meterid,locationid FROM [UCMS].[dbo].[T_METERINFO]
OPEN mycursor
fetch next from mycursor
declare @meterid int,@locationid int
fetch next from mycursor into @meterid,@locationid
print @meterid
print @locationid
close mycursor
deallocate mycursor
GO

-----------------存储过程
CREATE PROCEDURE PK_SalaryAdd
AS
 declare @O_ID nvarchar(20),@A_Salary float
declare mycursor cursor for select O_ID,A_Salary from AddSalary
open mycursor
fetch next from mycursor into @O_ID,@A_Salary
while(@@fetch_status = 0)
begin Update OriginSalary set O_Salary=O_Salary+@A_Salary where O_ID=@O_ID fetch next from mycursor into @O_ID,@A_Salary end close mycursor deallocate mycursor

GO

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值