gpt4 book ai didi

c# - 如何最小化锁定同时保持数据库相关操作是原子的

转载 作者:行者123 更新时间:2023-11-30 12:43:01 24 4
gpt4 key购买 nike

我有一个关于如何最小化数据库锁定但又保证操作是原子的的一般性问题。我的案例特别与 C#/SQL Server 相关,但这可能与语言无关。

我们必须定期将销售收入写入文件并通过 FTP 将其发送到另一台服务器。这是我们当前的流程:

  • 从 Sales 表中获取上一小时未处理的总销售额
  • 将总销售额/收入/杂项信息写入文件
  • 开始数据库事务
  • 更新销售表,表明销售已处理
  • 将文件发送到 FTP
  • 提交交易

问题是,我们向 FTP 服务器发送大量文件,这个过程需要相当长的时间。这导致了一些锁定问题,我们的客户无法注册或修改销售。但是,如果 FTP 传输或数据库更新因任何原因失败,我们需要回滚数据库操作并删除任何以前发送的文件。

推荐的方法是什么来保证操作是原子的同时最小化锁定?

最佳答案

您可以为 Sales 表的状态字段添加更多含义:

  • 未处理
  • 处理
  • 已处理

这样您就不必在通过 FTP 发送文件所需的整个时间内锁定行(和 MS SQL Server 中的页面)。您只需在选择相关记录时锁定相关记录,然后将状态更新为“处理中”,最后解除锁定。

FTP 作业完成后,您将相关记录更新为“已处理”。

您还应该制定一个计划流程来检查 FTP 作业是否失败。属于失败的 FTP 进程的记录的状态应再次更新为“未处理”。

编辑:您可以在下面找到 SQL 脚本

begin tran

declare @toBeProcessed table(saleid int);

insert into @tobeProcessed
select saleid
from Sales (rowlock)
where status = 'NotProcessed'

update Sales
set status = 'Processing'
where saleid in (select saleid from @toBeProcessed)

commit

select * from @toBeProcessed

关于c# - 如何最小化锁定同时保持数据库相关操作是原子的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32134207/

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