通过对象隔离实现原子性

问题描述 投票:0回答:1

我面临着一个我不知道如何有效解决的问题,该问题涉及大量使用 DBMS。我有一个长时间运行的过程刷新(通过批量插入/删除/更新)许多表。这些表是通过后端从数据库读取数据来访问的;拥有干净的信息至关重要;读取陈旧数据不是问题,重要的是避免读取部分更新的信息。

我正在尝试实现某种发布机制,其目的是保证原子性并避免读取部分重新计算的数据(可能会更改或消失)。我需要保证后端自动读取数据。这个重新计算过程。

我正在考虑复制内存中对象隔离的经典解决方案,该解决方案基本上将新旧对象分离在两个不同的内存区域中,让它们成为 A 和 B。所有读取操作都在 A 上执行,写入操作在 B 上执行;程序完成后,两个区域的角色就会互换。因此,读取始终由陈旧或刷新的数据支持,并且永远不会读取中间结果。

我认为我应该采用这种策略,因为当程序更新数据库时,由于事务之间的偶然性很高,来自后端的事务往往会超时。我认为物理上分离数据也会改善这方面。我还怀疑

segregation
不是描述我想要采用的策略的正确词,但在垃圾收集器的背景下,这个问题通常是这样解决和命名的。

显而易见的解决方案是复制所有表并选择表的工作版本来执行查询,也许在存储过程中。然而,这个解决方案存在将所有查询重写为存储过程并使用游标的问题...另一个问题出现在后端,由于我有大量的本机查询,我正在使用的技术(JPA)非常不灵活写。

问题是:有没有一种方便的方法通过SQL Server的特性来实现这种发布机制?

sql sql-server jpa stored-procedures atomic
1个回答
0
投票

只需使用命令激活数据库中的乐观锁定

ALTER DATABASE CURRENT SET READ_COMMITTED_SNAPSHOT ON;

一旦您的交易处理完所有数据,新数据将暴露给用户。在处理过程中,您的用户将能够读取旧数据。

无需通过创建天然气工厂来重新发明轮子!!!!

© www.soinside.com 2019 - 2024. All rights reserved.