sql - 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?
解决方案
您的原始表定义在 上没有索引BDDG_TicketId
。
这意味着UPDATE
和DELETE
查询都必须扫描所有行以找到与其WHERE
子句匹配的行 - 因此将被X
其他事务取出并持有的锁阻塞。
添加一个非聚集索引,BDDG_TicketId
以便在没有这种争用的情况下有效地识别相关索引。
推荐阅读
- java - 无法解析我用来初始化适配器的方法“getActivity()”
- java - 用实例方法替换静态方法
- php - 如何检查特定网站是否在 PHP 中设置了 SESSION
- php - MySQLi insert_id 返回 0
- javascript - 修复对象差异算法以创建数组而不是对象
- google-maps-api-3 - 标记单击事件未触发
- single-sign-on - OIDC IdP 提供商之上的代理,用于接受来自服务提供商的 SAML 请求以进行 SSO
- sql-server - 在 Management Studio 中使用 Python 自动化“生成脚本”选项以从本地 SQL Server 获取数据并将其保存在 .sql 文件中
- reactjs - onClick OverlayView react-google-maps
- visual-studio - [Broken] 在 CPU 使用率报告的 Function Name 列中表示什么?