问题标签 [transactional-database]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
undo - 在事务数据库中撤消
我不知道如何使用事务数据库实现用户友好界面的撤消属性。
一方面,建议用户具有多级(无限)撤消的可能性,如答案中所述。可能有助于解决此问题的模式是Memento 或Command。
然而,使用包含触发器、不断增长的序列号和不可逆过程的复杂数据库,很难想象撤消操作如何在事务边界之外的不同点工作。换句话说,撤消到最后一次提交的事务只是一个回滚,但是怎么可能回到不同的时刻呢?
更新(基于到目前为止的答案):我不一定希望在修改已经提交时撤消工作,我会专注于具有开放事务的正在运行的应用程序。每当用户单击保存时,这意味着提交,但在保存之前 - 在同一事务期间 - 撤消应该起作用。我知道使用数据库作为持久层只是一个实现细节,用户不应该为此烦恼。但是,如果我们认为“数据库中的撤消和 GUI 中的撤消概念是根本不同的东西”并且我们不对数据库使用撤消,那么无限撤消只是一个流行词。我知道“回滚是......不是用户撤消”。
那么如何在同一个事务中实现“任何更改导致的级联效果”的客户端级撤消呢?
database-design - 事务数据库中的快照设计以及参考数据的版本控制
免责声明:我已经阅读了有关堆栈溢出和 Internet 上的快照和版本控制主题的所有内容。我的要求不是审计跟踪或数据库级快照的版本跟踪。我花了超过 1 周的时间自行研究并考虑可能的选择。抱歉,我可能错过了一些链接 - 如果我的问题的解决方案已经在其他线程中讨论过,请指出我那里。
有点长;请多多包涵。
情况如下:我们正在尝试创建一个通用设计,以将事务数据的快照存储在我们的事务数据库中,并保留参考数据的修订历史。
作为业务流程的一部分,用户可以按下按钮发布特定对象。为了说明的目的,假设用户可以在谈判开始之前发布来自供应商的提案。然后,通过协商过程,在不同的时间点,用户可以发布提案数据。该提案包含预算、销售目标和许多其他项目。对提案进行快照时,必须对所有链接实体进行快照。最后,经过谈判,签订合同。此时,必须创建合约的完整快照。并非合同中的所有实体都存在于提案中——有很多重叠的实体,但提案和合同都有独特的实体。
我们必须保留这些已发布的版本和最新的活动版本。已发布的版本可在网站上获得,供供应商和管理团队参考。并非所有已发布的版本都在网站上提供,但最后发布的提案和最新发布的合同始终在网站上可用。该网站也必须从同一数据库中填充。
此外,财务用户可以决定仅对预算进行快照,而销售经理可以对销售目标进行快照。因此,快照可在多个粒度上使用。
我们还需要跟踪主数据的版本。随着时间的推移跟踪对关键主数据列的所有更改是一项业务需求。例如,我们有与销售目标相关的区域信息。区域的名称可以更改,我们希望跟踪这些更改。让我们假设在提案时,区域的名称是 R1,并创建了一个快照。然后,区域名称更改为 R2,然后创建另外 2 个快照。我们希望能够在这些时间点将销售目标链接到正确的区域名称,而不一定要链接到最新的区域名称。
我们在建模方面具有一定的灵活性,因为我们同时拥有事务数据库和数据仓库数据库,我们可以决定将其中一些信息存储在事务数据库或数据仓库数据库中。
这是我们的设计。我们有一个发布表,它捕获有关已发布数据的基本信息——发布者和发布日期、原因和发布对象的类型(提案或预算或销售目标)。
我们将快照存储在与原始数据相同的表中。因此,提案快照将与提案表中的实时提案一起存储。我们在每个必须发布的表中都有一个名为 Publication ID 的列。此列是 Publication 表的 FK。如果发布 ID 为空,则该记录是活动版本。
我意识到这篇文章很长。因此,我没有列出场景细节,而是想在思维导图中快速总结设计注意事项。
现在我们倾向于两种解决方案 - 两者都将存储所有数据的快照,无论它是否已更改。在保持表结构完整的同时仅维护增量将需要一个非常复杂的存储过程,该存储过程必须在任何快照对象的每次插入/更新时运行。我不想走这条路,因为这会花费更长的时间,而且数量也不会那么大。
解决方案 1:每次发布对象(如提案或预算)时,我们将填充 XML 树并将其保存在数据库中。网站上只需要提供最新版本,很少需要旧版本。鉴于此,由于使用 XML,我会遇到很大的性能问题吗?我们使用 SQL Server。数据量不是很大。
解决方案 2:所有事务表都有一个发布 ID,参考数据有开始和结束日期。每当发布对象时,我们都会复制所有事务记录并将发布 ID 放在那里,我们将复制所有参考数据记录并将快照日期作为结束日期。这将允许我们在发布过程之外对参考数据进行正常版本控制。
我需要有经验的人就这两种方法的缺点以及是否还有其他更好的方案提出意见。
database-design - 如何在事务数据库中存储已删除的行
这是 heximal 在我的其他帖子中提出的评论的后续。我想有一deleted_on
列来检测已删除的记录,十六进制表示该列是多余的。
这是他的评论:
您要使用
deleted_xx
字段来确定记录是否已删除?恕我直言,最好和最好的方法是添加以记录布尔数据类型的一些活动属性(例如名为的字段
ACTIVE
)。因此,为了“删除”记录,我们必须在单个 UPDATE 查询中更新ACTIVE
字段 和update_date
的值。updated_by
为了选择所有活动记录,我们只需要进行如下查询:SELECT * FROM MyTable WHERE ACTIVE=1
我知道 Oracle Applications 使用这种方法,我同意
我还阅读了以下帖子:
- 将已删除的行存储在表中
- http://www.udidahan.com/2009/09/01/dont-delete-just-dont/
- http://ayende.com/Blog/archive/2009/08/30/avoid-soft-deletes.aspx
我的问题是:如何在具有上面十六进制建议的isActive标志的表上设置唯一约束。我的所有表中都有代理键。但我想确保自然键列(我们称之为业务键列)具有唯一约束。
如果我有一个deleted_on
字段来跟踪删除,那么我可以将此列作为自然键约束的一部分。因此,它允许具有相同业务组合键的多个已删除记录,仅在 deleted_on 日期字段中有所不同。
如果我有isActive
字段并使用last_updated_on
列来跟踪删除日期,我必须在自然键约束上有 2 个选项
- 我可以将
isActive
其作为我的自然键约束的一部分。但这将允许最多只删除一条具有相同业务组合键的已删除记录。 - 我可以将
isActive
pluslast_updated_on
作为自然键约束的一部分。但我看到有一个额外的列 deleted_on 使它更容易。
有什么想法吗?我在这里错过了什么吗?
php - 在事务数据库上使用什么 mysql 扩展
我目前正在使用ezsql库。现在我想学习另一种使用 php 与 mysql 数据库交互的方法。如果我要连接到用于不同事务的数据库,我应该使用什么扩展。我应该使用 pdo 或 mysqli 还是您可以推荐的其他扩展?
sql-server-2008 - 不可靠通道上的事务性数据库复制
我想在 2 个办公室之间设置数据库复制(事务性),我想知道是否建议通过不可靠的渠道这样做?我计划在 Internet 上的 VPN 上设置此事务复制,并且我正在尝试解决 Internet 连接的中断问题。还有其他我应该考虑的事务复制问题吗?
此外,我无法弄清楚具有可更新订阅的事务复制和合并复制之间的区别,是否有任何推荐的文章/书籍用于复制最佳实践。
我希望在 SQL Server 2008 上设置此复制。提前致谢。
sql-server-2005 - 链接到 SQL Server 2005 后 DB2 事务数据库的性能受到影响
我们有一个 AS400 大型机运行我们的 DB2 事务数据库。我们还有一个 SQL Server 设置,它每晚都会加载来自 AS400 的数据。SQL Server 设置用于报告。
我可以链接两个数据库服务器,但是,有人担心来自 SQL Server 的查询会对 DB2 造成多大的性能影响。
基本上,担心的是,如果我们开始使用来自 SQL Server 的查询来访问 DB2,我们将陷入事务系统并搞砸订单和运输。
在此先感谢您提供任何可以分享的知识。
c# - 在 .NET 4.5.1 中异步执行事务数据库操作
我编写了一个程序以异步方式执行数据库操作。我尝试使用 BeginTransaction() 或 TransactionScope 在数据库事务中运行它,但没有运气。我单步执行了 VS2012 中的代码,并注意到当它看到 ExecuteNonQueryAsync 的等待时,执行会跳出 foreach 循环。
已编辑:包括方法标头/签名。
sql - 如何根据跨国表中的值仅选择一列结果?
我在一个项目表中有许多要出租的项目。我有一个跨国表,显示了我的项目表中每个项目的租赁历史。如果该项目当前未出租,则“可用性状态”列中的所有条目都将显示“已关闭”。如果该项目正在租用,“可用性状态”列中的一个字段将显示“ONRENT”。我想编写一个查询,列出每个出租项目并返回它们当前是“ONRENT”(不可用)还是“CLOSED”(可用)。我编写了一个查询,它返回“ONRENT”的租赁项目,因为我的 WHERE 子句可以找到唯一包含“ONRENT”的行。当“可用性状态”列中的所有行都显示“已关闭”时,不确定如何返回可用项目
sql - 在事务数据库中拥有涉及多个表的计算列的最佳方法是什么?
在事务数据库中拥有涉及多个表的计算列的最佳方法是什么?
背景
我们的事务型 MySQL 数据库包括如下简化模型的事实表:
Task
是 的孩子Project
。任务 ID 不是唯一的,但项目/任务对是唯一的。
要求
我们需要保持项目所有任务的总预算<=项目预算的不变性。
此外,我们经常需要运行一个查询,该查询返回一个包含以下列的结果集:
PROJECT_ID
, PROJET_DESC
, PROJECT_BUDGET
, TASK_COUNT
,PROJECT_MONEY_USED
问题
我们关心性能。最简单的解决方案需要更新以命中三个事实表:
- 检查添加到
F_MONEY_USED
不会使我们超出任务的预算F_TASK_BUDGET
。 - 检查添加资金不会使我们超出项目的总预算
- 写到
F_MONEY_USED
。
而我们需要获取统计信息的查询会命中三个事实表(除了查找表,上面的模型中没有):
- 加入
LU_PROJECT
到PROJECT_BUDGET
从F_PROJECT_BUDGET
组中PROJECT_ID
- 加入
LU_PROJECT
以F_TASK_BUDGET
获取TASK_COUNT
分组依据PROJECT_ID
- 加入
LU_PROJECT
F_MONEY_USED
以获取PROJECT_MONEY_USED
分组依据PROJECT_ID
- 加入
LU_PROJECT
上面的中间结果并得到PROJECT_DESC
。
问题是加入的次数很多,读写都会频繁发生。
潜在解决方案
我们正在考虑的一种解决方案是添加一个PROJECT_MONEY_USED
字段,F_PROJECT_BUDGET
该字段将在写入时更新F_TASK_BUDGET
。这会减慢写入速度,但会加快读取速度。
该解决方案还将引入复杂性和数据完整性问题,因为事实表将不再是“基本的”。这违反了数据仓库原则,但我无法确定它是否符合事务数据库的犹太教规。
如果我们可以在 UI 中进行乐观渲染,那么写入速度的下降可能不是什么大问题,但这会带来更多的复杂性。
考虑的其他解决方案
- 对于写入,我们正在考虑使用触发器来保留不变量。
- 对于读取,计算列看起来很有希望,但它们不允许在 MySQL 中访问多个表。
- 对于读取,物化视图可能不是一个选项,数据需要实时更新。
概括
是否有更好的解决方案以安全、简单和高性能的方式进行读写?
sql - PostgreSQL 事务 DDL 和 to_regclass
按照这个问题的建议,我正在使用该to_regclass
函数来检查表是否存在,如果不存在则创建它。但是,如果表是在当前事务中创建的,似乎to_regclass
仍然返回null
。
这种行为是预期的吗?或者这是一个错误?
细节
这是一个错误的简短示例: