如何最小化锁定,同时维护与数据库相关的操作是原子

时间:2015-08-21 06:58:44

标签: c# sql sql-server sql-server-2008 ftp

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

  • 未处理
  • 处理
  • 加工

通过这种方式,您无需在FTP上发送文件所需的整个持续时间内锁定行(以及MS SQL Server中的页面)。您只需在选择时锁定相关记录,然后将状态更新为" Processing"最后你释放了锁。

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