zoukankan      html  css  js  c++  java
  • SQL Server存储过程中防止线程重入处理方式

    对于线程重入,在C#中有lock关键字锁住一个SyncObject,而SQL Server也可用一个表来模拟实现。

    先创建一个同步表,相当于C#中的SyncObject,并插入一条记录(初始值为1)

    create table SyncTable(id bit)
    go
    insert into SyncTable (id) values (1)

    然后假设有个存储过程,有一系列操作,需要防止多线程同时访问到,可以这样写。

     
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    create PROCEDURE Proc_Test
    @name varchar(50)
    AS
    begin
    
    set xact_abort on
    
    begin tran
    
    update SyncTable set Id = Id * -1 
    
    waitfor DELAY '00:00:05' --假设一系列耗时操作
    
    select @name
    
    commit tran
    
    set xact_abort off
    
    END
    GO

    然后分别打开两个新建查询(相当于两个线程)

    exec Proc_Test @name='abc'
    exec Proc_Test @name='def'

    然后快速的对这两个查询,分别点“执行”

    可以看到执行时间,一个是5秒,一个是9秒(因为是人工点的,所以先点的已经运行了差不多1秒)。

    表明这个存储过程阻止了线程重入。

  • 相关阅读:
    UGUI Toggle控件
    UGUI Scrollbar控件
    利用头插法——创建、遍历链表
    函数指针
    opencv 图像通道操作
    三维点云匹配算法
    点与三角形位置关系
    室内场景mesh 的自动分块---用于加载显示,参数化等
    eigen 四元数
    string 、char*、const char *
  • 原文地址:https://www.cnblogs.com/siso/p/3692033.html
Copyright © 2011-2022 走看看