我们有一个用例,我们保持一个单调递增的关键字,表示当前版本的客户数据。如果在读取数据及其处理之间存在延迟并且它们获得多个版本,则在系统中使用它来确定最新版本并解决第三方呼叫者的冲突。
CUSTOMER_RESOURCE_ID CURRENT_VERSION
132323 1234
如果此资源发生了变化,我们会将版本从1234增加到1235(即使我们将其增加到1300,只要它不会下降,它也完全没问题)。为此,我们需要首先读取值然后更新它。
其他替代方法是使用DB的时间戳并继续使用DB时间戳更新版本,该时间戳将始终增加。由于这只是一个系统,因此时钟偏差只能在我们更改数据库时发生。此外,当多个线程在一小部分时间内(即时间戳的最小粒度)更新数据时,我们并不十分关注,因为我们有另一个锁,因此只有一个线程一次更新资源。
我想知道我们是否可以使用数据库的系统时间戳来避免只更新的选择和增量。
这种方法有什么问题吗?我假设它会减少数据库的开销,但我不知道我们在这里保存了多少。
答案 0 :(得分:0)
可以讨论许多方法。在我看来;
- 您可以使用增量序列,即使是默认列值而不是数据库时间戳。也许毫秒可能会给你带来麻烦。
- 此外,如果您的表格不是很大并且您的资源足够,您可以添加一个is_last_version列,该列将随每个插入更新以查询最终版本的客户(即select * from customers where customer_id = 123 and is_last_version= 1
- 摆脱订购成本)。因此,您可以知道哪一行是最后一个版本。但每次插入时间会更长。你应该测试一下。
示例:
CUSTOMER_RESOURCE:
CUSTOMER_RESOURCE_ID CURRENT_VERSION_ID IS_LAST_VERSION INSERT_TIME
(default seq) (default sysdate --optionally)
132323 1 1
132324 2 1
132325 3 1
132326 4 0
132327 5 0
132328 6 1
132326 7 0
132329 8 1
132326 9 1
132327 10 1
插入时:
update CUSTOMER_RESOURCE
SET IS_LAST_VERSION = 0
where CUSTOMER_RESOURCE_ID = 132326;
insert into CUSTOMER_RESOURCE(CUSTOMER_RESOURCE_ID,IS_LAST_VERSION) VALUES (132326,1);
COMMIT;
选择客户的最终版本时:
select * from customers where customer_id = 123 and is_last_version= 1;