久久久久久久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 中刪除行)
主站蜘蛛池模板: 亚洲成人精品 | 亚洲欧美日韩精品久久亚洲区 | 91伦理片| 久久国产日本 | 欧洲亚洲一区二区三区 | 免费在线观看成年人视频 | 久久久久国产一区二区三区 | 成人av电影免费在线观看 | 最新日韩av | 国产激情片在线观看 | 国产精品视频久久 | www国产成人免费观看视频,深夜成人网 | 亚洲人在线播放 | 网页av| 国产精品久久久亚洲 | 亚洲午夜在线 | 岛国av免费在线观看 | 久久99精品久久久久久 | 99re在线视频观看 | 午夜免费网站 | 精品久久久久久久人人人人传媒 | 国产精品精品久久久 | 性色视频 | 国产日韩欧美在线观看 | 久久国产一区二区三区 | 欧美日高清视频 | 成人免费大片黄在线播放 | 欧美一级大片免费观看 | 亚洲先锋影音 | 亚洲乱码国产乱码精品精的特点 | 免费在线观看一区二区三区 | 色资源在线 | 91久久国产综合久久 | 色婷婷一区二区三区四区 | 婷婷精品 | 亚洲第一女人av | 在线免费观看黄a | 久久视频精品 | 欧美国产日韩一区二区三区 | 国产精品美女久久久久aⅴ国产馆 | 欧美一级在线 |