久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

從存儲過程中檢測臟讀

Detecting dirty reads from a stored procedure(從存儲過程中檢測臟讀)
本文介紹了從存儲過程中檢測臟讀的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我有 100 個線程,每個線程都調用如下定義的存儲過程.

I've got 100 threads that are each calling the stored procedure as defined below.

如何防止臟讀?

SET QUOTED_IDENTIFIER OFF
SET ANSI_NULLS OFF
GO

ALTER procedure GetNextCerealIdentity
    (@NextKey int output, @TableID int)
AS
    declare @RowCount int, @Err int

    set nocount on

    select  
        @NextKey = 0

    begin transaction

Again:
    /*Update CfgCerealNumber Table */
    UPDATE CfgCerealNumber 
    SET CerealNumber = CerealNumber + 1  
    WHERE CerealNumberID = @TableID

    SELECT 
        @RowCount = @@RowCount, 
        @Err = @@Error      /*Obtain updated Cereal number previously incremented*/

    IF @Err <> 0            /* If Error gets here then exit         */
    BEGIN
        RAISERROR ('GetNextCerealIDSeries Failed with Error: %d TableID: %d ', 16, 1, @Err, @TableID)
        ROLLBACK TRANSACTION

        set nocount off
        return 1
    END

    IF @RowCount = 0                /* No Record then assume table is not   */
                                /* been initialized for TableID Supplied*/
    BEGIN
        RAISERROR('No Table Record Exists in CfgCerealNumber for ID:%d   ', 16, 1, @TableID)
        set nocount off
        Rollback Transaction
        return 1
    END

    /*Obtain updated Cereal number previously incremented*/
    SELECT @NextKey = CerealNumber 
    FROM CfgCerealNumber 
    WHERE CerealNumberID = @TableID

    SELECT @Err = @@Error                       /*Obtain updated Cereal number previously incremented*/

    IF @Err <> 0                            /* If Error gets here then exit         */
    BEGIN
        RAISERROR('GetNextCerealIDSeries Failed with Error: %d TableID: %d ', 16, 1, @Err, @TableID)
        Rollback Transaction    
        set nocount off
        return 1
    END

    commit transaction
    set nocount off
    return 0
GO

看起來這部分存儲過程在并行運行時大約有 0.01% 的時間返回相同的值:

It looks like this part of the stored procedure is returning the same value around 0.01% of the time when run in parallel:

SELECT @NextKey = CerealNumber 
FROM CfgCerealNumber 
WHERE CerealNumberID = @TableID

我通過將更新包裝在事務中來以防止臟讀的方式構建我的代碼.

I've structured my code in such a way to prevent dirty reads by wrapping the update in a transaction.

如何防止臟讀?

推薦答案

如果您需要更新并返回您更新的內容,那么我會使用 OUTPUT 子句:

If you need to update and return what you updated, then I would just use the OUTPUT clause:

UPDATE CfgCerealNumber 
SET CerealNumber = CerealNumber + 1 
OUTPUT INSERTED.CerealNumber
WHERE CerealNumberID = @TableID;

如果你需要額外的檢查,你可以在從存儲過程返回結果集之前輸出到一個聲明的表變量中.

If you need additional checking, you can OUTPUT into a declared table variable before returning the result set from the stored procedure.

另一種選擇是先在表上創建一個阻塞鎖,然后更新:

Another alternative would be to create a blocking lock on the table first, and then update:

SELECT @CerealNumber = CerealNumber + 1 
FROM CfgCerealNumber WITH (HOLDLOCK, UPDLOCK) 
WHERE CerealNumberID = @TableID;

UPDATE CfgCerealNumber
SET CerealNumber = @CerealNumber
WHERE CerealNumberID = @TableID;

但我會放下錢,因為我已經看到這仍然會導致問題.我不太相信它.

But I would put money down that I've seen this still cause problems. I trust it much less.

這篇關于從存儲過程中檢測臟讀的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

SQL trigger on Truncate(截斷時的 SQL 觸發器)
sql search query with multiple optional search parameters(具有多個可選搜索參數的 sql 搜索查詢)
SQL Efficiency: WHERE IN Subquery vs. JOIN then GROUP(SQL 效率:WHERE IN 子查詢 vs. JOIN 然后 GROUP)
Retrieving XML element name using t-SQL(使用 t-SQL 檢索 XML 元素名稱)
Insert double quotes into SQL output(在 SQL 輸出中插入雙引號)
Delete rows from CTE in SQL SERVER(從 SQL SERVER 中的 CTE 中刪除行)
主站蜘蛛池模板: 日韩精品视频中文字幕 | 亚洲欧美国产精品久久 | 久久99蜜桃综合影院免费观看 | 日韩欧美中文字幕在线观看 | 超碰3 | 精品国产欧美 | 综合五月 | 国产精品二区三区 | 精品国产一区二区三区av片 | 欧美一级片在线播放 | 99热这里有精品 | 一级毛片视频 | 久久99视频精品 | 国产一二三区在线 | 91久久精品国产 | 日韩成人免费在线视频 | 欧美日韩在线不卡 | 国产精品资源在线 | 中文在线一区 | 亚洲国产精品人人爽夜夜爽 | 国产精品福利视频 | 久久久久成人精品免费播放动漫 | 亚洲国产一区二区视频 | 91精品国产综合久久久久久漫画 | 波波电影院一区二区三区 | 99国产精品视频免费观看一公开 | 欧美精品久久久 | 日韩精品在线观看视频 | 日韩欧美在线视频观看 | 国产高清精品一区二区三区 | 亚洲欧美日韩一区 | 午夜激情视频在线 | 久久久久久免费免费 | 国产美女自拍视频 | 91av在线免费观看 | 可以在线看的黄色网址 | 欧美区在线观看 | 免费一区二区 | 日韩色综合 | av在线播放网 | 欧洲一区二区在线 |