代码之家  ›  专栏  ›  技术社区  ›  Matt Dawdy

如何在没有数据库的情况下保存自动增量/标识值?

  •  0
  • Matt Dawdy  · 技术社区  · 15 年前

    我收到了一个紧急项目(ASP.NET C Framework v2),当然是在周一早上。这是一个非常简单的项目——向现有站点添加一个“请求报价”页面。基本上,收集一些信息,然后将表单的内容通过电子邮件发送给公司的某个人,并向用户显示一个“谢谢”页面。简单到派……直到我刚刚读到最后一个要求。

    每一份提交的表格都应该有一个“确认号”,从10000开始,每一份表格都会依次递增一个数字。

    听起来很简单,对吧?嗯,这个网站上没有数据库。不知道为什么,除了我需要的信息来满足需求之外,我真的对这个网站一无所知。

    因此,考虑到这一点,并且意识到这并不是最佳的,我想我唯一的解决方案是制作一个文本文件(yuck)并读取它,获取使用的最后一个数字,添加一个,然后将其写回文本文件。当然,在文件的“锁定”方面还需要很多,这样我就不会得到重复的数字。

    有人对我有什么建议吗?我对任何事情都很开放…

    3 回复  |  直到 15 年前
        1
  •  2
  •   McPherrinM    15 年前

    首先,我假设每个进程都有某种可用的唯一标识符。这可以是一个进程ID,或者在没有竞争条件的情况下保证是唯一的。将该值写入具有相同名称的文件,这样您就不会在创建该文件时遇到竞争。然后,如果不存在,将其移动到名为“lock”的文件中。通过查看内容来检查这是否成功。现在从确认号文件中读取该值。检查“lock”文件中是否有您的唯一标识符——这可以确保不会有两个人试图将文件移动到lock。如果是您的,请将递增的编号和唯一ID写回确认号文件。再次检查您是否持有锁,确认号文件是否具有您的ID。然后删除锁文件。 如果失败,只需等待锁定文件消失,然后再试一次。

    这将允许您以无争用的方式写入文件,并确保序列号始终增加1。

        2
  •  0
  •   Chris Fulstow    15 年前

    您可以在Windows注册表中跟踪确认号,但如果提供了该选项,那么按照您的建议使用简单的文本文件可能会更容易。确保每次清除(即释放)文件句柄以释放任何文件锁。

        3
  •  -1
  •   Shimmy Weitzhandler 500 - Internal Server Error    15 年前

    我认为XML是一个很好的解决方案。

    This post可能会使XML对您来说更加容易。