交易后验证数据,并在必要时回滚

时间:2018-06-20 19:59:01

标签: javascript transactions indexeddb

我的问题涉及在事务完成之后验证数据以确保对象存储之间的一致性,如果验证失败和/或以另一种方式挽救数据,则回滚该事务。最主要的问题是捕获由于将数据库的某些部分写入磁盘并用磁盘中的数据填充数据库而产生的数据错误。

我的特定情况是,一个对象存储区包含一个指针数据,该指针保存几乎所有其他对象存储区中所有数据对象的键路径,并协调这些数据对象的显示和使用。

从文本文件中读取数据并用于填充数据库并完成写事务后,我想通过至少确认计数匹配以及如果是否匹配来验证指针数据和对象存储数据是否一致可能的是,指针中的所有键路径在每个对象库中都有一个匹配项。我不希望指针指向数据库中不再存在的键路径;而且我不希望在读取或写入文本文件时未捕获的数据对象从数据库中消失。

除了用户故意篡改文本文件或编码疏忽外,可能会出现不一致的唯一原因是在创建文本文件时写入数据库或从数据库读取时出现某种类型的打cup 。验证的目的不是捕获编码错误或文件篡改,而只是确保数据到达了应有的位置并保持一致。因此,它正在检查浏览器是否做了它所说的。不应有编码错误;文件篡改几乎肯定会导致更大的问题,这些问题将在其他地方捕获并停止程序。

也许,这里有三个问题。

  1. 是否可以在transaction.oncomplete函数中执行验证,以便如果验证失败,则可以使用transaction.abort或类似的方法(如果有其他选择)来回滚事务?还是在交易完成后回滚为时已晚?我认为,就我而言,等同于回滚事务可以手动执行,可以说,如果无法回滚已完成的事务,因为已知用户会尝试这样做。

  2. 忽略用户的文件篡改和编码错误,确认完成的交易是否产生了预期的数据是否为时过早?

  3. 如果合理的话,您可以分享有关如何最好地实现以下方案的建议吗?

我希望能够通知用户将数据从文件写入数据库时​​发生错误,然后再次尝试;并且,如果第二次出错,则使用户能够挽救数据。当然,我也想在文件也写入磁盘之前在读取端检查结果。

例如,可能显示一条消息,指出学习模块5缺少数据对象32。即使无法恢复数据对象32,也可以将指针修改为不再指向它,并且用户将知道模块5需要进行审查,因为它将从31跳到33,并且在运行时毫无意义。当发生此类错误时,还可以执行该程序特定的其他操作。例如,每个模块必须先通过验证步骤,然后才能运行。如果特定模块中发生数据库错误,则可以通过编程将验证状态更改为false,从而使得该模块在重新验证之前无法运行。

用户可以花费几个小时来构建单个学习模块,因此,重要的是,他们必须将模块保存到磁盘上并进行恢复而不丢失工作。我假设我所说的数据库打cup非常罕见,但是如果发生这种打,,我不希望用户失去学习模块的全部内容,而是希望能够挽回很多麻烦尽可能独立于程序内部。

谢谢。

1 个答案:

答案 0 :(得分:1)

  1. 可以中止交易,但不能中止
  2. 是的,矫kill过正
  3. 编写对每个操作进行断言的测试。如果可以证明每个原子操作正确完成,那么可以推断出经过几次操作后,聚合中的数据处于正确状态

如果您担心丢失工作,请以未完成的状态保存数据。只需在每行中存储一个“完成的”布尔值。定期保存completed = false(或=不完整)。在真正的保存时间,保存一个带有completed = true的行,然后删除不完整的