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

從存儲過程中檢測臟讀

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

問題描述

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

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

我通過將更新包裝在事務(wù)中來以防止臟讀的方式構(gòu)建我的代碼.

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

如何防止臟讀?

推薦答案

如果您需要更新并返回您更新的內(nèi)容,那么我會使用 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;

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

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

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

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;

但我會放下錢,因為我已經(jīng)看到這仍然會導(dǎo)致問題.我不太相信它.

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

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

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

相關(guān)文檔推薦

SQL trigger on Truncate(截斷時的 SQL 觸發(fā)器)
sql search query with multiple optional search parameters(具有多個可選搜索參數(shù)的 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精品国产一区二区三区 | 久久99精品视频 | avtt国产 | 一区二区三区视频在线观看 | 91在线观看 | 中文字幕av亚洲精品一部二部 | 亚洲精选一区二区 | 成人福利在线观看 | 99精品久久 | 欧美一级二级视频 | 亚洲电影成人 | 欧美日韩高清 | 国产一区二区三区不卡av | 久久精品男人的天堂 | 国户精品久久久久久久久久久不卡 | 久久精品一区二区三区四区 | 91久久久久久久久久久 | 成人av片在线观看 | 在线色网| 97久久精品午夜一区二区 | 久久久久91 | www.操com| 中文字幕免费在线 | 99久久久久久久久 | 干干干日日日 | 国产成人精品一区二区三区 | 国产精品日韩高清伦字幕搜索 | 精品日韩电影 | 欧美一区二区三区精品免费 | 在线欧美一区 | 欧美日韩视频在线播放 | 成人在线免费网站 | 国产中文字幕在线观看 | 日韩欧美手机在线 | 久久精品中文字幕 | 国产精品久久久久久久久免费高清 | 欧美色人 | 日韩在线| 日本小电影在线 |