每秒数千次的插入更新和选择

Jer*_*oyd 7 sql-server-2008 deadlock

我有一个表,可以在一秒钟内从数千次中插入、更新和选择。不过我遇到了死锁问题。

  1. 数据库有 2-5 个同时使用 Linq to Sql 的 1000+ 行插入。
  2. 每秒 40 次,还有一个来自该表的选择语句,如果条件为真(95% 的时间为真),则使用类似于以下的代码进行更新:

    创建过程 AccessFile (@code, @admin) AS

    声明@id int、@access 日期时间、@file 字符串

    从代码 = @code 的文件中选择 @id=Id、@accessed = 访问、@file = 文件

    IF @admin<> 0 IF @accessed 为空开始

    设置事务隔离级别读取未提交

    更新文件集访问 = getdate() 其中 id = @id

    设置事务隔离级别读取已提交

    结尾

    选择@id 作为Id,@file 作为文件

似乎是更新与导致死锁的插入冲突。

该示例是一个 1 比 1 的存储过程,唯一的区别是名称。假定为 1 和 2,无论存储过程名称如何。

mrd*_*nny 2

将更新更改为使用WITH (ROWLOCK)。这将减少从页级到行级的锁定。您也可以在插入件上尝试相同的操作。

  • 尝试尝试快照隔离级别。我将对执行插入的代码进行相同的更改(除非它们是由存储过程完成的)。它可能会有所帮助,但会大大增加 tempdb 的使用量。顺便说一句,将隔离级别更改为读取未提交的更新不会执行任何操作。我假设 ID 列是您的聚集索引? (2认同)