SQL Server插入并发问题

时间:2017-05-15 16:47:12

标签: sql sql-server

我们有一个必须处理SQL Server表中每个新记录的作业。此表有一列Created,其约束条件将此列的值默认为GETUTCDATE()。工作程序如下:

  1. 作业查询Created值大于或等于上次Created值的所有记录
  2. 作业处理所有返回的记录
  3. 作业将其上次看到的Created值更新为其在记录中看到的最高Created值。
  4. 这似乎工作得很好,但是,我们注意到这项工作有时会跳过记录。我们认为这可能是因为以下情况:

    1. 交易A开始插入新记录。 SQL Server将Created值默认为1
    2. 交易B开始插入新记录。 SQL Server将Created值默认为2
    3. 交易B提交
    4. 作业处理该表并查看事务B创建的记录。该作业将其上次看到的Created值更新为2
    5. 交易A提交
    6. 作业处理该表但“跳过”事务A创建的记录,因为其Created值小于上次看到的Created值。
    7. 这种情况可能吗?在挂起的插入事务完成之前,读取操作是否会阻塞?

1 个答案:

答案 0 :(得分:0)

描述处理作业时使用READ UNCOMMITTED隔离级别的情况(从表中选择* with(nolock)或SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED in script)。请检查READ COMMITTED(删除带有nolock的提示)列表中的作业选择数据。