首页 > 解决方案 > SQL Server:执行更新查询时,无法执行删除查询

问题描述

tbl_bettingdetails_DG 表结构:

CREATE TABLE [dbo].[tbl_BettingDetails_DG](
    [BDDG_Id] [int] IDENTITY(1,1) NOT NULL,
    [BDDG_UserId] [int] NULL,
    [BDDG_Token] [varchar](50) NULL,
    [BDDG_Data] [varchar](50) NULL,
    [BDDG_TicketId] [bigint] NOT NULL,
    [BDDG_BetAmount] [decimal](18, 4) NULL,
    [BDDG_WinLoseAmount] [decimal](18, 4) NULL,
    [BDDG_BeforeAmount] [decimal](18, 4) NULL,
    [BDDG_AfterAmount] [decimal](18, 4) NULL,
    [BDDG_Status] [tinyint] NOT NULL,
    [BDDG_winloseDatetime] [datetime] NULL,
    [BDDG_CreatedDate] [datetime] NOT NULL,
    [BDDG_NetWinLoseAmount] [decimal](18, 4) NULL,
 CONSTRAINT [PK_tbl_BettingDetails_DG_1] PRIMARY KEY CLUSTERED 
(
    [BDDG_Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[tbl_BettingDetails_DG] ADD  CONSTRAINT [DF_tbl_BettingDetails_DG_BDDG_winloseDatetime]  DEFAULT (getdate()) FOR [BDDG_winloseDatetime]
GO

ALTER TABLE [dbo].[tbl_BettingDetails_DG] ADD  CONSTRAINT [DF_tbl_BettingDetails_DG_BDCT_CreatedDate]  DEFAULT (getdate()) FOR [BDDG_CreatedDate]
GO

ALTER TABLE [dbo].[tbl_BettingDetails_DG]  WITH CHECK ADD  CONSTRAINT [FK_tbl_BettingDetails_DG_tbl_MasterStatus] FOREIGN KEY([BDDG_Status])
REFERENCES [dbo].[tbl_BettingDetails_MasterStatus] ([StatusId])
GO

ALTER TABLE [dbo].[tbl_BettingDetails_DG] CHECK CONSTRAINT [FK_tbl_BettingDetails_DG_tbl_MasterStatus]
GO

存储过程1:

    BEGIN TRY 
        BEGIN TRAN
           UPDATE tbl_bettingdetails_DG 
           SET BDDG_BetAmount = 222222 
           WHERE BDDG_TicketId = 3489495541

           WAITFOR DELAY '00:00:10'
        COMMIT TRAN
    END TRY
    BEGIN CATCH
        ROLLBACK TRAN                   
    END CATCH

存储过程 2:

DECLARE @ErrorMessage NVARCHAR(MAX) = NULL
    BEGIN TRY 
        BEGIN TRAN

        DELETE t1 
        FROM tbl_BettingDetails_DG t1  
        WHERE BDDG_TicketId = 1231231232

        COMMIT TRAN
    END TRY
    BEGIN CATCH
        ROLLBACK TRAN   
        SELECT @ErrorMessage=CAST(ERROR_MESSAGE() AS NVARCHAR(MAX))
    print @ErrorMessage

    END CATCH

我首先执行存储过程 1,虽然它还没有提交,但我有 10 秒的时间,然后我执行存储过程 2。

为什么存储过程 2 必须等到存储过程 1 执行完成,才执行删除查询?我的删除查询不是同一个票号,两个查询没有任何关系。

如何在不等待存储过程 1 完成的情况下执行存储过程 2?

我尝试添加非聚集索引,它正在工作,我将屏幕截图作为参考发送。 在此处输入图像描述

标签: sqlsql-server

解决方案


您的原始表定义在 上没有索引BDDG_TicketId

这意味着UPDATEDELETE查询都必须扫描所有行以找到与其WHERE子句匹配的行 - 因此将被X其他事务取出并持有的锁阻塞。

添加一个非聚集索引,BDDG_TicketId以便在没有这种争用的情况下有效地识别相关索引。


推荐阅读