首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编辑数据库数据中的同步数据真的很重要吗?

编辑数据库数据中的同步数据真的很重要吗?
EN

Stack Overflow用户
提问于 2014-03-28 11:55:29
回答 1查看 63关注 0票数 0

我在一个库存跟踪web应用程序中工作。我在设计用户界面时遇到了一些问题,特别是编辑采购清单。

下面是我的Purchase表的概述数据结构

代码语言:javascript
复制
+------+-------+------+------+-----------
| ID   | Name  | Price| QTY  | Date    |
+------+-------+------+------+-----------
|B03-13|Goods1 |10000 |10    |2014-3-10
|B03-14|Goods2 |10000 |20    |2014-3-10
|B03-13|Goods3 |20000 |5     |2014-4-10

平均价格表

代码语言:javascript
复制
+------+----------+----------
| ID   | Avg Price| Date    |
+------+----------+----------
|B03-13|1000      |2014-3-10
|B03-13|500       |2014-3-10
|B03-13|2000      |2014-4-10

计算移动平均价格(价格*总)/总库存

假设我们有1000行数据,当我们编辑一个数据时,说它是第三个数据,当然,应用程序会再次计算整个数据。编辑行将导致最终平均价格变化。所以我必须计算它之后的整行(在用户编辑的行之后),检查“平均价格”表并更新相关数据,每次用户进行更改。

在这种情况下,我们应该放弃“编辑数据”功能,还是只允许用户编辑他们最后插入的数据?

谢谢你的回答,我希望这对其他有同样问题的人有帮助。

EN

回答 1

Stack Overflow用户

发布于 2014-03-28 12:25:09

你的问题有多个方面,而且非常宽泛。我将重点介绍一些随意选择的细节,其他方面可能会涉及其他方面。

如何处理一个用户对多个DB表的相关更改?

这是通过将所有更改放入单个事务中来完成的。这样一来,当你改变价格或添加新的购买时,给定商品的平均价格将同时发生变化。对于外部观察者,他们既可以看到旧数据,也可以看到新数据,但不能看到不一致的数据,其中一个表已更改,但另一个表尚未更改。当然,这必须考虑数据库的实现细节,以及其事务系统和存储后端提供的ACID guarantees类型。

如何处理多个用户对同一DB表的更改?

一种方法是锁定相关的数据库行,以防止其他人更改它们,只要公开给定数据以进行修改的用户界面会话启动即可。

另一种方法是向用户更改的所有表中添加一个Generation列。当获取用户界面数据时,也会获取世代号。当提交更改事务时,所有查询都使用where Purchase.Generation = ...等进行限定。这样,任何源自陈旧数据的更改都将失败。

另一种与generation列互操作的方法是提交相关事务,而不是绑定到某个层代,而是作为不关心现有值的更改事务。例如,如果您以一定的价格收到了一定数量的小部件,那么在Purchase表中,您要么添加到现有行,要么创建新行。在AvgPrice表中,您将根据Purchase表中的相关值自动修改该值。因此,其他用户可能同时购买了相同的商品并不重要:无论发生什么,数据库都将保持一致,而您获得100多个商品的操作将导致以下结果:某个地方的计数器将会上升(在现有的或新的行中)。这就像是银行账户上的一笔存款交易。

当然,从业务角度来看,我们可能仍然希望这样的事务失败,因为可能原始用户不再需要购买这100件商品。

如何向用户呈现失败的事务?

这取决于上下文。有时,就像在银行存款的情况下一样,您什么也不做,只需重试相同的事务,因为事务具有“增量”语义而不是“用新值替换”语义。取款是类似的,但不完全是:它是一个“增量”事务,但它可能会以两种方式失败:

  • 正在执行并发事务并中止了此事务。您总是在这种情况下重试。

  • A事务失败,因为不再满足业务约束。例如,在此期间,余额低于满足提款所需的最低要求。这是一个严重的失败,重试不会修复它。

其他时候,除了用于生成事务的数据之外,还可以向用户呈现更新后的数据,并突出显示已更改的内容。这取决于数据的呈现方式。例如,在inventory表中,您可以直观地指出“同时”更改的字段。然后,系统将提示用户为这些字段重新输入所需的值或增量,以明确确认仍然需要相同的更改。鉴于其他人已经订购了相同的小部件,这将迫使重新考虑购买小部件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22703894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档