gpt4 book ai didi

sql-server - 我怎样才能按时运行一次程序?

转载 作者:行者123 更新时间:2023-12-03 13:20:30 26 4
gpt4 key购买 nike

我编写了多线程应用程序,每个线程都调用一个 sql server 过程。我需要保护一行不被多个线程占用我希望每一行只被一个线程占用我使用了这个代码:

CREATE PROCEDURE GetRow
@ThreadID int
AS
BEGIN

DECLARE @rowID int;
SELECT TOP (1) @rowID=[ID] FROM [TestTable] WHERE [ThreadID] = 0 (AND some other parameters)

IF @rowID is not NULL
BEGIN
UPDATE TOP (1) [TestTable] SET [CallCount] = [CallCount]+1,[ThreadID] = @ThreadID WHERE [ID] = @rowID

--some other codes

END
END

正如我所说,我运行应用程序,然后我的应用程序创建 10 个线程,我将 threadid 设置为仅由一个线程占用一行,但我看到一行被超过 1 个线程调用,并且大约 4-5 个线程得到一行.. 怎么可能我这样做是最好的方法,我通过这段代码解决了这个问题,我不喜欢在选择和更新中有两个相同的位置:
CREATE PROCEDURE GetRow
@ThreadID int
AS
BEGIN

DECLARE @rowID int;

UPDATE TOP (1) [TestTable] SET [CallCount] = [CallCount]+1,[ThreadID] = @ThreadID WHERE [ThreadID] = 0 (AND some other parameters)


SELECT TOP (1) @rowID=[ID] FROM [TestTable] WHERE [ThreadID] = @ThreadID (AND some other parameters)

IF @rowID is not NULL
BEGIN

--some other codes

END
END

我怎么能用顶级代码做到这一点?我应该先更新然后选择上面的代码来修复它吗?

最佳答案

如果您使用的是 SQL Server 2005 或更新版本,您也许可以 combine the UPDATE and SELECT 使用新的 OUTPUT clause .

但是,我建议备份并考虑您的数据库架构,以及它是否真的适合您的问题——尤其是多线程!

我得到的印象是你想计算来自每个线程的调用。每次通话 INSERT 会更好。一行成简单的ThreadCallCount只有一个 ThreadID 的表柱子。每个调用都是一个新行。以后可以Sum()此表由 ThreadID获取每个线程的总调用次数。这将很简单,很容易确保它是线程安全的。

听起来您正在尝试检索其他一些数据,但尚不清楚它是如何/何时存储的。但是类似的分析——以及更多、更简单的表格——可能会对你有所帮助。

一般来说:不要觉得你需要把所有东西都挤在一张 table 上。使用多线程将有助于将事物分解成更小的部分。随意使用更多表,每个表都有一个明确的目的。 SQL Server 旨在安全有效地处理行事务,因此请尽量利用它。

关于sql-server - 我怎样才能按时运行一次程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17630667/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com