使用 Select 的表上的 SQL 插入更新可能会使用 MERGE 导致锁定和等待问题

发布于 2025-01-13 12:21:27 字数 1287 浏览 2 评论 0原文

我们有两个数据库表:PointsMaster(PM)和PointsDetails(PD),这里的要求是检查PM表的currentbalance是否大于“x”,如果大于“x”则更新PM表的currentbalance(即将 currentbalance 减少“x”),然后在 PD 表中添加关于该“x”点的新记录。

如果当前余额低于“x”,则不会更新 PM 表,也不会插入 PD 表。 如果 currentbalance 为 NULL,那么我们只需返回 null。

现在编写这些个人:- SELECT 然后 UPDATE (PM) 和 INSERT (PD) 会导致锁定问题,我正在考虑使用“MERGE”(在 PM 表上),这样我就可以在一个事务中执行 SELECT 和 UPDATE 而不会导致锁定问题PM 表上的任何锁定,但我的问题是如何检查 CurrentBalance 是否为空或低于“X”并将其返回,以便可以针对这 2 个条件(即空余额或余额小于“x”)。

MERGE 可以通过 SELECT 帮助我,如果 PM 上有 MATCHED UPDATE 的话。但是,只有当 PM 上的 UPDATE 发生时,PD 上的 INSERT 才必须发生,否则不会发生,而且如果 Balance 低于“x”或 Null,我必须将其返回并不更新 PM 或将记录添加到 PD。

这里有什么帮助吗?由于我们的代码会导致锁定和等待,并且对于数据量来说效率不高。 PM 和 PD 表具有所需的索引。

上述所有操作都是通过 Azure 托管的 Function App 中的 C#.Net 完成的。

思考以下SQL代码

Declare @rcount INT;

MERGE PointsMaster as tgt
Using PointsMaster as src
ON (tgt.ProfileID = src.ProfileID)
WHEN MATCHED AND tgt.ProfileID ='3589153' and tgt.CurrentBalance > 50000000
Then UPDATE SET tgt.CurrentBalance = tgt.CurrentBalance - 5;
Set @rcount= @@ROWCOUNT;

if (@rcount > 0)
Begin
INSERT INTO PointsDetails ( PointsHeaderID,Debit,Credit,ActionTypeCode,TransactionDate) Values (3587854,5,0,'AT2',Getdate())
End
if (@rcount = 0)
Begin
SELECT * from PointsMaster where ProfileID = '3589153'
End

We have two database tables : PointsMaster (PM) and PointsDetails (PD), the requirement here is to check if PM table has currentbalance of greater than "x" and if it is greater than "x" then update the PM table's currentbalance (i.e. reduce currentbalance by "x") and then also put a new record in the PD table about this "x" points.

If the currentbalance is lower than "x" then no updates to PM table and no insert to PD table.
If currentbalance is NULL then simply we need to return back null.

Right now writing these individual:- SELECT and then UPDATE (PM) and INSERT (PD) is causing lock issues and I am thinking of using "MERGE" (on PM Table) so I can do SELECT and UPDATE in one transaction and not cause any locks on PM table but my issue here is how do I check if CurrentBalance is Null or Lower than "X" and return that back so that processing can happen for those 2 conditions (i.e. of Null balance or when balance is less than "x").

MERGE can help me here with SELECT and if MATCHED UPDATE on PM.. but the INSERT on PD has to happen only if UPDATE on PM happened else not and also if Balance is lower than "x" or Null I have to return that back and not UPDATE PM or ADD record to PD.

Any help here? As the code we have is causing locks and waits and is not efficient with volume of data. PM and PD tables have required indexes in place.

All of the above is being done from C#.Net in a Azure hosted Function App.

Thinking of following SQL Code

Declare @rcount INT;

MERGE PointsMaster as tgt
Using PointsMaster as src
ON (tgt.ProfileID = src.ProfileID)
WHEN MATCHED AND tgt.ProfileID ='3589153' and tgt.CurrentBalance > 50000000
Then UPDATE SET tgt.CurrentBalance = tgt.CurrentBalance - 5;
Set @rcount= @@ROWCOUNT;

if (@rcount > 0)
Begin
INSERT INTO PointsDetails ( PointsHeaderID,Debit,Credit,ActionTypeCode,TransactionDate) Values (3587854,5,0,'AT2',Getdate())
End
if (@rcount = 0)
Begin
SELECT * from PointsMaster where ProfileID = '3589153'
End

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文