c# – 如何最小化锁定,同时维护与数据库相关的操作是原子的
发布时间:2020-12-15 22:18:52 所属栏目:百科 来源:网络整理
导读:我有一个关于如何最小化数据库锁定但保证操作是原子的一般性问题.我的案例特别涉及C#/ SQL Server,但这可能是一个与语言无关的问题. 我们必须定期将销售收入写入文件并通过FTP将其发送到另一台服务器.这是我们目前的流程: 在过去一小时内从销售表中获取未处
我有一个关于如何最小化数据库锁定但保证操作是原子的一般性问题.我的案例特别涉及C#/ SQL Server,但这可能是一个与语言无关的问题.
我们必须定期将销售收入写入文件并通过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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |