- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在与我的团队一起开发一项生成发票编号的功能。要求说:
我们正在使用 php 和 postgres。我们 tought 通过以下方式实现这一点:
考虑到在同一笔交易中可能会创建多张发票,我的问题是:这是一种足够安全的方法吗?它的缺陷是什么?您建议如何改进它?
最佳答案
我认为这里最关键的一点是:
- there should be no gaps between invoice numbers
在这种情况下,您不能使用序列和自动递增字段(正如其他人在评论中建议的那样)。自动递增字段在后台使用序列,无论交易成功还是失败,nextval(regclass)
函数都会递增序列的计数器(您自己指出)。
我的意思是您根本不应该使用序列,尤其是您提出的解决方案并没有消除间隙的可能性。您的触发器获得新的序列值,但 INSERT
仍可能失败。
序列以这种方式工作,因为它们主要用于 PRIMARY KEYs
和 OIDs
值生成,其中唯一性和非阻塞机制是最终目标,值之间的差距是真的没什么大不了的。
然而,在您的情况下,优先级可能不同,但有几件事需要考虑。
您的问题的第一个可能解决方案是返回新数字作为当前现有数字的最大值。它可以在你的触发器中完成:
NEW.invoice_number =
(SELECT foo.invoice_number
FROM invoices foo
WHERE foo._year = NEW._year
ORDER BY foo.invoice_number DESC NULLS LAST LIMIT 1
); /*query 1*/
这个查询可以使用你的复合 UNIQUE INDEX
如果它是用“正确”的语法和列顺序创建的,首先是“year”列,例如:
CREATE UNIQUE INDEX invoice_number_unique
ON invoices (_year, invoice_number DESC NULLS LAST);
在 PostgreSQL 中,UNIQUE CONSTRAINTs
被简单地实现为 UNIQUE INDEXes
,因此大多数时候您将使用哪个命令没有区别。但是,使用上面介绍的特定语法可以定义该索引的顺序。这是一个非常好的技巧,如果发票表变大,它使 /*query 1*/
比简单的 SELECT max(invoice_number) FROM invoices WHERE _year = NEW.year
更快。
这是一个简单的解决方案,但有一个很大的缺点。当两个事务尝试同时插入发票时,可能会出现竞争条件。两者都可以获得相同的最大值,UNIQUE CONSTRAINT
将阻止第二个提交。尽管如此,在一些具有特殊插入策略的小型系统中它可能就足够了。
你可以创建表
CREATE TABLE invoice_numbers(
_year INTEGER NOT NULL PRIMARY KEY,
next_number_within_year INTEGER
);
存储特定年份下一个可能的数字。然后,在 AFTER INSERT
触发器中,您可以:
LOCK TABLE invoice_numbers IN ACCESS EXCLUSIVE;
new_invoice_number = (SELECT foo.next_number_within_year FROM invoice_numbers foo where foo._year = NEW.year);
UPDATE invoice_numbers SET next_number_within_year = next_number_within_year + 1 WHERE _year = NEW._year;
因为表锁在事务提交之前持有,这可能应该是最后触发的触发器(read more about trigger execution order here)
不用LOCK
命令检查link而不是锁定整个表由 Craig Ringer 提供
这种情况下的缺点是INSERT
操作性能下降---当时只有一个事务可以执行插入。
关于php - 使用数据库触发器生成无间隙数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32924835/
不确定是间隙还是音频样本未对齐,但是当我将音频文件一分为二时,如下所示: ffmpeg -ss 0 -t 00:00:15.00 -i song.mp3 seg1.mp3 和 ffmpeg -ss 0
我正在使用 NSDrawNinePartImage 绘制自定义按钮/文本字段。我在代码中将图像分割成九个部分,并使用 NSDrawNinePartImage 将其绘制到一个矩形中。 不幸的是,我在绘图
Check this image for the progressbar 知道如何消除 ProgressBar 下的那个小间隙吗?我怎样才能做到没有差距?应该通过 MainActivity 中的 ja
刚开始制作网站时,整个左侧都有几个像素的边距,但我不明白为什么。 http://jsbin.com/elufob/1/ 任何建议将不胜感激 CSS html{ min-width: 1
我一直在尝试在我的网站上使用静态图像,但页眉和图像之间存在很大差距,我尝试在 Photoshop 和 HTML 中删除填充并更改图像高度。这是我的问题的 fiddle https://jsfiddle
我前一段时间遇到过这个问题,忘记了解决方案是什么。我的文档顶部有一个小间隙,大概 5/10 像素? 我想你会知道我在说什么,我该如何摆脱它? 谢谢 最佳答案 在您的 CSS 文件中添加: html,
刚开始制作网站时,整个左侧都有几个像素的边距,但我不明白为什么。 http://jsbin.com/elufob/1/ 任何建议将不胜感激 CSS html{ min-width: 1
我正在尝试使用 Accordion MUI 组件在展开模式下不会移动,也不会对某些元素应用顶部和底部边距。 示例如下,但它不起作用,我的组件仍然太“跳跃”(扩展时它会增加宽度,并且添加了一些不可见的边
我有一个自定义 UITableViewCell Card 样式的动态高度,它的空间在应用程序中是恒定的。我正在使用 Storyboard ,并且在 UINavigationBar 下方有 UITool
假设您有一组日期范围 var arr = [ { "from": 'unix 1st of august', "until": 'unix 5th of august' },
我是radial-gradient的新手,我不知道这些多维数据集之间的背线或空格是什么?如何删除它们? * {margin: 0; outline: 0; border: 0;} .round {
我对 VBA 中的 HTML 正文有疑问。我创建了一封电子邮件并使用 HTML 填写信息。 我的问题描述如下: Reduce Gap between HTML and elements 但是我不能
我正在阅读 Lea Verou 的《CSS secret 》一书。 有一个圆 Angular 径向多重渐变的例子: http://dabblet.com/gist/24484257bc6cf7076a
我一直在为一个客户做一个元素,一切都很顺利,直到我注意到我的 h1/h2/h3(任何标题标签)已经向右移动了 2/3 像素。他们可能一直都在这样做,但我只是刚刚注意到。当您在 devtools 中突出
这里是 CSS 新手。奇怪的事情发生了,链接之间有间隙,我不知道为什么。 我正在使用 html html5 样板 css 进行重置。 HTML代码: Link 1 Link
这个问题在这里已经有了答案: margin on h1 element inside a div (3 个答案) 关闭 6 年前。 我有一个问题,我的 h1 标签与我的页面顶部分开 - 像这样:en
我希望我的文本在事件时带有下划线,但当我这样做时它看起来像这样: 我只希望文本有下划线,如果我使用 text-decoration:underline 它会在单词下划线,但我不知道如何在文本和下划线之
我似乎无法将这两张图片放在一起。它们都在 HTML 表格中自己的行中(我正在制作一封 html 电子邮件),但我似乎无法删除它们之间的 5px。 这是我的代码 它也在 jsfi
我正在尝试在我的项目中使用新的 CardView UI 小部件,但在某些运行 android 2.3 的设备上,CardView 角之间存在间隙(见下文)。 这是在我的 xml 文件中:
我想了解并学习当我使用共享边框填充两个形状/路径时遇到的问题的解决方案,即在为所有形状调用填充后,仍然有一个微小的间隙存在于他们之间。 该代码片段展示了绘制所涉及的形状/路径的代码: ctx.begi
我是一名优秀的程序员,十分优秀!