关于sqlserver存储过程事务锁的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于sqlserver存储过程事务锁的问题相关的知识,希望对你有一定的参考价值。

sql server在一个事务的执行过程中,锁是不是一直存在,比如一个过程中
begin try
begin tran
select ....from table1
update table1 set ...
commit tran
end try
中间有两个操作,锁是不是一直存在的 ,如果是多线程并发调用这个过程,会不会有影响

就你上面的事例而言,select的共享锁性质是得到结果即释放,不会在事务中保留
而update所用到的U锁及其进一步的X锁则需要持续到事务的结束
如果是多线程的程序的话,在select与update处都可能会出现锁等待,这要根据实际操作中数据是否冲突来看追问

就是说在select的操作结束后,锁就会释放,然后UPDATE的时候会重新加锁是吧。那如果正好select执行结束释放锁,另一个线程也开始调用这个过程,那这张表是否还是处于被锁状态

追答

select是共享锁,顾名思义,通常情况下,任何查询任何事务中的select是都不会冲突的
与共享锁冲突的是更新时的X锁,X锁与其他全部锁都冲突

参考技术A commit tran 一执行锁就释放了,但如果你是把这段程序放到循环中做,锁释放的时间会很短,别的进程可能竞争不进去。 参考技术B 根据情况在select的时候可以使用nolock或者readpast参数
例如:select * from tabname(nolock)

以上是关于关于sqlserver存储过程事务锁的问题的主要内容,如果未能解决你的问题,请参考以下文章

mysql存储过程出现锁表锁行的情况怎么解决

sqlserver 存储过程 使用事务,说明在下边,求大神指教!

关于sqlserver存储过程的问题

SQLSERVER 存储过程中的事务

sqlserver 2008 关于存储过程中的临时表。

SQL Server 2005 事务复制无法发布包含索引创建的存储过程