【发布时间】:2013-09-21 17:19:40
【问题描述】:
我在 SQL Server 中有一个存储过程。当我从 Delphi 执行它时,我收到一条死锁消息!
事务(进程 ID 60)因锁定而死锁 |通用等待对象资源与另一个进程并已被选为死锁受害者
为了解决这种情况,我应该在下面的查询中进行哪些更改。我的存储过程没有参数。
ALTER PROCEDURE [dbo].[RepairStocks]
AS
BEGIN
SET NOCOUNT ON;
drop table [dbo].[stocksss]
select
Barkod,
sum(kolicina) as Kolicina,
Max(Kategorija) as Kategorija,
Max(Artikal) as Artikal,
Max(Opis) as Opis,
Max(N_cena) as N_cena,
Max(N_cena) * sum(kolicina) as N_Iznos,
Max(P_cena) as P_cena,
Max(P_Cena) * sum(kolicina) as P_Iznos,
Max(datum) as datum,
Max(Golemina) as Golemina
into [dbo].[stocksss]
from [dbo].[Stocks]
group by Barkod
drop table [dbo].[Stocks];
select *
into [dbo].[Stocks]
from [dbo].[stocksss]
END
任何帮助都非常感谢......
编辑我的查询后
下面的查询可以在 SQL Server 上运行,但是当我从 Delphi 执行它时,我再次收到死锁消息。这是我的查询的样子:
ALTER PROCEDURE [dbo].[RepairStocks]
AS
BEGIN
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
select
Barkod,
sum(kolicina) as Kolicina,
Max(Kategorija) as Kategorija,
Max(Artikal) as Artikal,
Max(Opis) as Opis,
Max(N_cena) as N_cena,
Max(N_cena) * sum(kolicina) as N_Iznos,
Max(P_cena) as P_cena,
Max(P_Cena) * sum(kolicina) as P_Iznos,
Max(datum) as datum,
Max(Golemina) as Golemina
into #tmp_stocks
from [dbo].[Stocks]
group by Barkod
--------------------------------
;
DROP TABLE [dbo].[Stocks]
;
--------------------------------
select *
into [dbo].[Stocks]
from #tmp_stocks with (nolock)
;
drop table #tmp_stocks
;
COMMIT TRAN
END
在 Delphi 中,我使用以下代码执行命令:
RepairStocks.Close;
RepairStocks.SQL.Clear;
RepairStocks.SQL.Add('EXEC [dbo].[RepairStocks]');
RepairStocks.ExecSQL;
【问题讨论】:
-
尝试使用
with (nolock)提示,即...from [dbo].[Stocks] with (nolock)。确保Barkod已编入索引。使用本地临时表和LEVEL SNAPSHOT的单个事务(如答案中所建议)。 -
您使用的是什么组件?塔多查询? tsqlquery?
标签: sql sql-server tsql delphi