代码之家  ›  专栏  ›  技术社区  ›  Dportology

替换MSSQL服务器存储过程以防止数据库锁定

  •  0
  • Dportology  · 技术社区  · 6 年前

    我们当前的解决方案速度有所放缓,数据库锁定也令人沮丧,该解决方案基本上包括调用MSSQL服务器上的存储过程来操作数据。如果两个或多个用户试图同时命中同一个表,则其中一个被锁定,其请求将失败。

    该问题的建议解决方案是使用sqlalchemy将数据引入python,并在数据帧中对其执行任何操作/计算。这 工作 但由于对DB的网络调用,速度非常慢。

    有没有更好的解决方案可以支持多个并发用户,而不会造成太多的减速?

    2 回复  |  直到 6 年前
        1
  •  1
  •   RiyajKhan    6 年前

    可以在存储过程中使用nolock关键字来消除此问题

    在存储过程中,在write-nolock关键字前面指定表名,我希望这对您有用

    例如:。 从tablename1 t1中选择* 在t2上连接nolock tablename2 t2。id=t1。id号

        2
  •  1
  •   Dave C    6 年前

    您可以更改webapp以检查过程是否已经在运行,或者中止运行事件(单击),或者通过同时禁用按钮(计时器是否重新启用?)主动阻止它。

    SELECT * 
    FROM (SELECT * FROM sys.dm_exec_requests WHERE sql_handle IS NOT NULL) A 
    CROSS APPLY sys.dm_exec_sql_text(A.sql_handle) T 
    WHERE T.text LIKE 'dbo.naughty_naughty_proc_name%'
    

    然后,也许可以修改proc作为保护措施,以防止多个实例使用 sp_getapplock

    我不会盲目地改变 read uncommitted 作为您的隔离级别。在我看来,这是一个非常糟糕的建议,因为我们没有任何关于这个系统/数据有多重要的上下文,而您清楚地指出数据正在“被操纵”。在执行此操作之前,您确实需要了解数据以及您正在影响的系统!

    一些阅读:

    https://www.mssqltips.com/sqlservertip/3202/prevent-multiple-users-from-running-the-same-sql-server-stored-procedure-at-the-same-time/

    Why use a READ UNCOMMITTED isolation level?