我有一个关于如何最小化数据库锁定但保证操作是原子的一般性问题.我的案例特别涉及C#/ SQL Server,但这可能是一个与语言无关的问题.
我们必须定期将销售收入写入文件并通过FTP将其发送到另一台服务器.这是我们目前的流程:
>在过去一小时内从销售表中获取未处理的总销售额
>将总销售额/收入/杂项信息写入文件>开始数据库交易>更新销售表,表明销售已处理完毕>将文件发送到FTP>提交交易问题是,我们向FTP服务器发送了大量文件,这个过程需要很长时间.这导致了一些锁定问题,我们的客户无法注册或修改销售.但是,如果FTP传输或数据库更新因任何原因失败,我们需要回滚db操作并删除任何以前发送的文件.
什么是建议的方法来保证操作是原子的,但最小化锁定?
您可以为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#中如何最小化锁定,同时维护与数据库相关的操作是原子的的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did69423