【问题标题】:How would I lock a stored procedure that is executing and alter the table that the stored procedure returns?如何锁定正在执行的存储过程并更改存储过程返回的表?
【发布时间】:2019-06-17 06:57:53
【问题描述】:

我有一张如下表:

id    status
--    ------
1     pass
1     fail
1     pass
1     na
1     na

另外,我有一个存储过程,它返回一个表,其中前 100 条记录的状态为“na”。存储过程可以由环境中的多个节点调用,我不希望它们获取重复数据。所以,我想在存储过程执行时锁定存储过程,并将从存储过程获取的记录的状态设置为“进行中”并返回该表然后释放锁,这样不同的节点就不会获取相同的数据。我将如何做到这一点?

【问题讨论】:

    标签: sql sql-server stored-procedures jdbc rdbms


    【解决方案1】:

    您可以将 select 与 WITH (SERIALIZABLE) 隔离级别一起使用,以确保记录被锁定,直到状态更新如下。

    SELECT TOP 100 id 
    INTO   #temp 
    FROM   [your_table] WITH (serializable) 
    WHERE  status = 'na' 
    
    UPDATE ut 
    SET    status = 'In Progress' 
    FROM   [your_table] ut WITH (serializable) 
           INNER JOIN #temp T 
                   ON T.id = ut.id 
    

    SERIALIZABLE 隔离级别指定以下内容:

    • 语句无法读取已修改但尚未修改的数据 由其他事务提交。
    • 没有其他事务可以修改已由 当前事务直到当前事务完成。
    • 其他事务不能插入带有键值的新行 落在当前任何语句读取的键范围内 交易直到当前交易完成。

    Source (MSDN)

    【讨论】:

    • 更新 ut...这里有什么?
    • ut 是用于更新的表的别名。
    • 如果有两个表,我应该使用“from table1, table2 with serializable”吗?如果从两个表中获取记录,那么应用相同格式是正确的格式吗
    • 来自 table1 WITH (serializable) , table2 WITH (serializable) 。更好地使用连接
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多