我正在使用Entity Framework,我正在将记录插入到包含blob字段的数据库中.blob字段最多可以包含5 MB的数据.
将记录插入此表时,是否锁定整个表?
因此,如果您正在查询表中的任何数据,它是否会阻塞,直到插入完成(我意识到有解决方法,但我默认说话)?
它会导致死锁需要多长时间?那个时间是否取决于服务器上的负载量,例如,如果没有太多负载,是否需要更长时间才能导致死锁?
有没有办法监控并查看在任何特定时间锁定的内容?
如果每个线程都在对单个表进行查询,那么是否存在可能发生阻塞的情况?因此,如果您的查询具有连接并且作用于多个表,则不会发生死锁吗?
这考虑到我的大多数代码只是一堆select语句,而不是长时间运行的事务或类似的事情.
我创建了一个存储过程来对我的API实现速率限制,每秒调用大约5-10k次,每天我都注意到计数器表中的dupes.
它查找传入的API密钥,然后使用"UPSERT"检查带有ID和日期组合的计数器表,如果找到结果,则执行UPDATE [count] +1,如果不是,则会插入新行.
计数器表中没有主键.
这是存储过程:
USE [omdb]
GO
/****** Object: StoredProcedure [dbo].[CheckKey] Script Date: 6/17/2017 10:39:37 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[CheckKey] (
@apikey AS VARCHAR(10)
)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @userID as int
DECLARE @limit as int
DECLARE @curCount as int
DECLARE @curDate as Date = GETDATE()
SELECT @userID = id, @limit = limit FROM [users] WHERE apiKey = @apikey
IF @userID IS NULL
BEGIN
--Key not found
SELECT …Run Code Online (Sandbox Code Playgroud) 我有两个存储过程在不同的线程中运行,在SQL Server 2005上运行.一个过程将新行插入到一组表中,另一个过程从同一组表中删除旧数据.这些过程在表DLevel和Model上遇到死锁.这是架构:
滚动条图像http://www.barramsoft.com/pub/images/DeadLock2.jpg
表DFile:主键= DFileID
表DLevel:主键= DLevelID,外键:DFileID
表模型:主键= ModelID,外键:DFileID
表ELement:主键= ElementID,外键1:DFileID,外键2:DLevelID
我已经隔离了导致死锁的确切的两个SQL语句(每个存储过程一个).我已经看到任何一个程序报告的死锁.我在两种情况下都使用top(1000),并且两个语句都在循环中执行,直到它们完成而没有剩下的行来删除/插入.
SQL语句1:
while (...)
begin
delete top (1000) from DLevel where DFileID = @fileID1
...
end
Run Code Online (Sandbox Code Playgroud)
SQL语句2:
while (...)
begin
insert into Element (ElementID, DFileID, LevelNum, ...)
select top (1000) el.ElementID, el.DFileID, el.LevelNum, ...
from ElementLoader el with (nolock)
left outer join Element e with (nolock)
on e.ElementID = el.ElementID
where el.DFileID = @fileID2
and e.ElementID …Run Code Online (Sandbox Code Playgroud) 这是一个扩展,是否可以强制SQL Server中的行级锁定?.这是用例
我有帐户表,帐户号码,余额等.许多应用程序正在使用此表.很可能在我修改帐户时,其他人正在修改另一个帐户.所以预期的行为是我会锁定我的帐户(ROW)而另一个用户将锁定他的(另一个ROW).
但SQL Server 2008 R2将此锁定升级到页面/表,第二个用户获得超时异常.我已经尝试了所引用问题中提到的所有解决方案,但没有任何工作.
如何强制SQL Server仅锁定行级锁定?或者如何以与页面/表锁定一起使用的方式修改此模型?
编辑 此更新通过其PK以单个记录为目标,并且已编入索引,因此只有一行正在更新/锁定,并且该过程不会超过一分钟
编辑 现在它看起来很奇怪.我正在为DAL使用ORM库,它打开了多个连接,我已经向他们的支持提出了问题.但是,出于测试目的,我打开了两个关于查询工具的会话,并做了以下
Session # 1
begin tran
UPDATE myTable SET COL_1 = COL_1 WHERE COL_1 = 101;
Session # 2
SELECT COL_1 FROM myTable WHERE COL_1 = 101;
Run Code Online (Sandbox Code Playgroud)
Session#2中的查询超时!!! 对其他值的查询COL_1工作正常.现在它看起来如果同一记录在另一个会话中处于编辑模式,则会阻止SELECT.
虽然Oracle确实支持在被其他会话修改时选择一行(使用默认的params/no关键字),但SQL Server没有(使用默认的params/no关键字),所以看起来问题出在库中.
我在一个存储过程上的性能非常差,它对一些非常小的表进行了超过一百次(!)的更新,并且似乎所有并发用户都在不断地相互阻塞.
程序的完全重写计划在今年晚些时候进行,但与此同时我想看看我们是否可以通过强制每个受影响的表上的行级锁定来缓解这个问题.
在Sybase上,您可以(或者至少可以在2007年左右)使用以下语句强制对表执行行级锁定:
alter table titles lock datarows
Run Code Online (Sandbox Code Playgroud)
在SQL Server上,似乎获得相同效果的唯一方法是在每个更新或插入语句上使用WITH(ROWLOCK).即便如此,它只是一个可以忽略的暗示.
SQL Server中是否有一种方法可以强制(或强烈支持)对给定表的所有更新进行行级锁定?
sql-server ×4
counter ×1
deadlock ×1
locking ×1
nolock ×1
performance ×1
rowlocking ×1
sql ×1
t-sql ×1
upsert ×1